日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

最大团问题-分支界限法

發(fā)布時間:2025/3/20 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最大团问题-分支界限法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最大團問題-分支界限法

  • 遍歷所有點構(gòu)造二叉樹;

  • 廣度遍歷樹,遍歷過程中判斷當前結(jié)點的點數(shù)據(jù)時,是否構(gòu)成完全子圖,如果不能則只將右結(jié)點加入隊列,每次選取隊列中完全子圖最大的結(jié)點作為活結(jié)點,無子結(jié)點時到達葉子結(jié)點,記錄為一個完全子圖,優(yōu)先隊列法中第一個完全子圖即為最優(yōu)解。

  • package?test;import?java.util.*;/***?Created?by?saishangmingzhu?on?2018/12/10.*?最大團問題*/ public?class?MaximumCliqueProblem?{//圖private?int[][]?pointIndex=new?int[][]{{1,1,0,1,1},{1,1,1,0,1},{0,1,1,0,1},{1,0,0,1,1},{1,1,1,1,1}};public?static?void?main(String[]?arg){new?MaximumCliqueProblem().branchAndBoundMethod();}/***?分支界限法-優(yōu)先隊列式*?優(yōu)先隊列式求解時,到達第一個沒有子結(jié)點的活結(jié)點時,即為最優(yōu)解*/public?void?branchAndBoundMethod()?{List<Point>?pointList=new?ArrayList<>();pointList.add(new?Point("1",0));pointList.add(new?Point("2",1));pointList.add(new?Point("3",2));pointList.add(new?Point("4",3));pointList.add(new?Point("5",4));//【1】構(gòu)建樹Node?root=new?Node();createTree(pointList,?root,0);//【2】廣度遍歷List<Node>?currentLiveNodeList=new?ArrayList<>();currentLiveNodeList.add(root);while?(true)?{//排序Node?parent?=?currentLiveNodeList.get(0);if?(parent.leftNode==null){//表示到了葉子結(jié)點,進行記錄//點不算子圖,所以要去除點集為1的葉子break;}List<Point>?leftPointList?=?parent.leftNode.hasPointList;if?(judge(leftPointList)?!=?0)?{currentLiveNodeList.add(parent.leftNode);}//因為右結(jié)點是空,所以不需要判斷//List<Point>?rightPointList=parent.rightNode.hasPointList;currentLiveNodeList.add(parent.rightNode);currentLiveNodeList.remove(parent);Collections.sort(currentLiveNodeList,?new?Comparator<Node>()?{@Overridepublic?int?compare(Node?o1,?Node?o2)?{return?o2.hasPointList.size()-o1.hasPointList.size();}});}System.out.println("最大團");for?(Point?point:currentLiveNodeList.get(0).hasPointList){System.out.print(point.name+",");}}/***?判斷現(xiàn)有節(jié)點是否是完全子圖?-1?表示不是*?@param?pointList*?@return*/private?int?judge(List<Point>?pointList){for?(int?i=0;i<pointList.size();i++){Point?pointi=pointList.get(i);int?indexi=pointi.index;for?(int?j=i+1;j<pointList.size();j++){Point?pointj=pointList.get(j);int?indexj=pointj.index;//使用[indexi][indexj]是為了說明問題,可以直接使用[i][j]if?(pointIndex[indexi][indexj]!=1){return?0;}}}return?1;}private?void?createTree(List<Point>?pointList,?Node?parent,int?i)?{if?(i>=pointList.size()){return;}Node?leftNode=new?Node();leftNode.hasPointList.addAll(parent.hasPointList);leftNode.hasPointList.add(pointList.get(i));i++;createTree(pointList,leftNode,i);parent.leftNode=leftNode;Node?rightNode=new?Node();rightNode.hasPointList.addAll(parent.hasPointList);createTree(pointList,rightNode,i);parent.rightNode=rightNode;}class?Point{private?String?name;private?int?index;public?Point(String?name,int?index)?{this.name?=?name;this.index?=?index;}}class?Node{private?Node?leftNode;private?Node?rightNode;private?List<Point>?hasPointList=new?ArrayList<>();} }


    轉(zhuǎn)載于:https://blog.51cto.com/zuohao1990/2328591

    總結(jié)

    以上是生活随笔為你收集整理的最大团问题-分支界限法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。