日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

求AOE图的 拓扑排序 及关键路径长度(java实现)

發布時間:2024/9/27 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求AOE图的 拓扑排序 及关键路径长度(java实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1.AOE圖:
  • 2.AOE圖鄰接鏈表存儲結構:
  • 3.代碼實現
    • 3.1.實體及參數初始化
    • 3.2.代碼實現
    • 3.3.輸出

1.AOE圖:

2.AOE圖鄰接鏈表存儲結構:

3.代碼實現

3.1.實體及參數初始化

//鄰接表的鏈表節點 @Data public class LinkedNode {//鄰接鏈表頂點編號private int nodeNum;//頭節點到當前鏈表節點的 弧上的權值private int weight;//當前鏈表節點指向的下一個鏈表節點private LinkedNode nextLinkedNode;} //鄰接表中頭節點 @Data public class HeadNode {//節點編號private int nodeNum;//指向的下一個鏈表節點private LinkedNode nextLinkedNode;} //AOE網絡 圖 @Data public class AoeGraph {//頂點數量private int verticesNum ;//邊數量private int edgeNum;//圖的鄰接表的 頭結點集合private HeadNode[] headNode;}

將AOE圖及其鄰接鏈表的關系轉化成實體:

//AOE圖的鄰接鏈表的初始化static LinkedNode v0_2 = new LinkedNode(2,30,null);static LinkedNode v0_1 = new LinkedNode(1,10,v0_2);static HeadNode v0 = new HeadNode(0,v0_1);static LinkedNode v1_5 = new LinkedNode(5,50,null);static LinkedNode v1_3 = new LinkedNode(3,30,v1_5);static HeadNode v1 = new HeadNode(1,v1_3);static LinkedNode v2_5 = new LinkedNode(5,20,null);static LinkedNode v2_4 = new LinkedNode(4,30,v2_5);static HeadNode v2 = new HeadNode(2,v2_4);static HeadNode v3= new HeadNode(3,null);static LinkedNode v4_3 = new LinkedNode(3,10,null);static HeadNode v4 = new HeadNode(4,v4_3);static LinkedNode v5_3 = new LinkedNode(3,20,null);static HeadNode v5 = new HeadNode(5,v5_3);//鄰接鏈表的頭節點集合static HeadNode[] headNodeArr = new HeadNode[]{v0,v1,v2,v3,v4,v5};//AOE圖static AoeGraph aoeGraph = new AoeGraph(6,8,headNodeArr);

3.2.代碼實現

public static void main(String[] args) {int length = criticalPathCalc(aoeGraph);System.out.println("length : "+length);}public static int criticalPathCalc(AoeGraph aoeGraph){int verticesNum = aoeGraph.getVerticesNum();//圖的 頂點數量HeadNode[] headNodeArr = aoeGraph.getHeadNode(); //圖的鄰接表的 頭結點集合int [] inDegree = new int[verticesNum]; //記錄每個頂點的 實時入度 (初始化后,默認每位都是0)int [] weightSum = new int[verticesNum];//記錄從開始頂點到 當前頂點的 實時最大權值 (初始化后,默認每位都是0)ConcurrentLinkedQueue<HeadNode> inDegreeZero = new ConcurrentLinkedQueue<>();//記錄入度為0 的頂點 int nodeNum =0 ; //節點的編號//計算每個節點的入度for (int i = 0; i < headNodeArr.length; i++) {HeadNode headNode = headNodeArr[i];//當前操作的鄰接鄰接鏈表頭節點LinkedNode linkedNode = headNode.getNextLinkedNode();//當前頭節點的指向的 鄰接節點;while (null!=linkedNode){inDegree[linkedNode.getNodeNum()]++;//指向的 鄰接節點的 入度加1linkedNode = linkedNode.getNextLinkedNode();//指針指向 頭節點的下一個鄰接節點}}//將入度為0 的節點 放入隊列for (int i = 0; i < inDegree.length; i++) {if(0==inDegree[i]){inDegreeZero.add(headNodeArr[i]);//將入度為0 的節點放入隊列}}//只要隊列不為空,就不斷彈出入度為0的節點。相當于在圖中擦去入度為0的節點及其相關邊while (!inDegreeZero.isEmpty()){HeadNode headNode = inDegreeZero.poll();//彈出 入度為0的 節點 作為 =》頭節點(相當于擦去入度為0的節點)System.out.println(headNode.getNodeNum());//輸出拓撲序列LinkedNode nextLinkedNode = headNode.getNextLinkedNode();//頭節點指向的 =》 鏈表節點while (null!=nextLinkedNode){nodeNum = nextLinkedNode.getNodeNum();//當前頭節點指向的 鏈表節點的 編號inDegree[nodeNum]--;//鏈表節點入度減1 (相當于擦去入度為0的節點到其指向的鏈表節點之前的弧)if(0==inDegree[nodeNum]){inDegreeZero.add(headNodeArr[nodeNum]);//如果當前鏈表節點入度=0,放入隊列(準備循環把入度為0的它也擦掉)}//開始節點到當前鏈表節點的累加權值 < 當前頭節點到當前鏈表節點的弧線權值 + 開始節點到當前頭節點的累加權值if(weightSum[nodeNum] < nextLinkedNode.getWeight()+ weightSum[headNode.getNodeNum()]){//開始節點到當前鏈表節點的最大權值 = 上訴比較的最大值weightSum[nodeNum] = nextLinkedNode.getWeight() + weightSum[headNode.getNodeNum()];}nextLinkedNode = nextLinkedNode.getNextLinkedNode();//獲取頭節點的下一個鏈表節點}}return weightSum[nodeNum];//}

3.3.輸出

0 1 2 4 5 3 length : 80

總結

以上是生活随笔為你收集整理的求AOE图的 拓扑排序 及关键路径长度(java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。