生活随笔
收集整理的這篇文章主要介紹了
C++实现AOE网中的关键路径算法(邻接表存储)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼如下:
#include <iostream>
#include <stack>
#include <string>
using namespace std
;
const int N
= 10010;
using vnodeType
= int;typedef struct Node
{int adj
;int tw
;Node
*next
;
}Node
;typedef struct Vnode
{vnodeType v
;int in
;Node
*first
;}Vnode
;class AoeGraph
{public:AoeGraph(){memset(adjlist
, 0, sizeof(adjlist
));memset(ve
, 0, sizeof(ve
));memset(tpord
, 0, sizeof(tpord
));memset(vl
, 0, sizeof(vl
));}void createGraph(){int n
, m
;cin
>> n
>> m
;vn
= n
;en
= m
;for (int i
= 0; i
< vn
; i
++){cin
>> adjlist
[i
].v
;adjlist
->first
= nullptr;}for (int i
= 0; i
< m
; i
++){int x
, y
, w
;cin
>> x
>> y
>> w
;Node
*p
= new Node
;p
->adj
= y
;p
->tw
= w
;p
->next
= adjlist
[x
].first
;adjlist
[x
].first
= p
;}}void findIn(){for (int i
= 0; i
< vn
; i
++){adjlist
[i
].in
= 0;}for (int i
= 0; i
< vn
; i
++){for (Node
*p
= adjlist
[i
].first
; p
; p
= p
->next
){adjlist
[p
->adj
].in
++;}}}bool TopOrder(){stack
<int>s
;findIn();for (int i
= 0; i
< vn
; i
++){if (adjlist
[i
].in
== 0){s
.push(i
);}}int n
= vn
;int cnt
= 0;while (!s
.empty()){int xx
= s
.top();s
.pop();n
--;tpord
[cnt
++] = xx
;for (Node
*p
= adjlist
[xx
].first
; p
; p
= p
->next
){int yy
= p
->adj
;adjlist
[yy
].in
--;if (adjlist
[yy
].in
== 0){s
.push(yy
);}if (ve
[xx
] + p
->tw
> ve
[yy
]){ve
[yy
] = ve
[xx
] + p
->tw
;}}}if (!n
) return true;else return false;}bool Criticalpath(){int cnt
= vn
;if (!TopOrder()) return false;for (int i
= 0; i
< vn
; i
++){vl
[i
] = ve
[vn
- 1];}for (int i
= cnt
- 1; i
>= 0; i
--){int xx
= tpord
[i
];for (Node
*p
= adjlist
[xx
].first
; p
; p
= p
->next
){int yy
= p
->adj
;if (vl
[yy
] - p
->tw
< vl
[xx
]){vl
[xx
] = vl
[yy
] - p
->tw
;}}}int e
= 0;int l
= 0;for (int i
= 0; i
< vn
; i
++) coll
[i
] = false;for (int i
= 0; i
< vn
; i
++){for (Node
*p
= adjlist
[i
].first
; p
; p
= p
->next
){int k
= p
->adj
;e
= ve
[i
];l
= vl
[k
] - p
->tw
;if (e
== l
) {coll
[i
] = coll
[k
] = true;}}}return true;}void dfs(int v
,int cnt
,int ans
){path
[cnt
++] = v
;if (v
== vn
- 1){cout
<< "value = " << ans
<< endl
;for (int i
= 0; i
< cnt
; i
++){cout
<< path
[i
] << " ";}cout
<< endl
;return;}for (Node
*p
= adjlist
[v
].first
; p
; p
= p
->next
){int k
= p
->adj
;if (!vis
[k
] && coll
[k
]){vis
[k
] = true;dfs(k
, cnt
, ans
+ p
->tw
);vis
[k
] = false;}}}void printPath(){for (int i
= 0; i
< vn
; i
++) vis
[i
] = false;vis
[0] = true;dfs(0, 0, 0);}private:Vnode adjlist
[N
];int vn
;int en
;int tpord
[N
];int ve
[N
];int vl
[N
];bool coll
[N
];bool vis
[N
];int path
[N
];
};int main()
{AoeGraph g
;g
.createGraph();g
.Criticalpath();g
.printPath();return 0;
}
測試結果:
總結
以上是生活随笔為你收集整理的C++实现AOE网中的关键路径算法(邻接表存储)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。