C++实现AOE网中的关键路径算法及机动时间计算算法(邻接表存储)
生活随笔
收集整理的這篇文章主要介紹了
C++实现AOE网中的关键路径算法及机动时间计算算法(邻接表存储)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
代碼如下:
#include <iostream> #include <stack> using namespace std; const int N = 100;typedef struct Node {int adj;int w;Node *next;}Node;typedef struct VNode {int in;int v;Node *first;VNode(){first = nullptr;} }VNode;class AOE { private:VNode adjList[N];int vn;int en;int tpord[N];int ve[N];int vl[N];bool coll[N];int path[N];bool vis[N]; public:AOE(){memset(ve, 0, sizeof(ve));memset(vl, 0, sizeof(vl));}void buildAOE(){int n, m;cin >> n >> m;vn = n;en = m;for (int i = 0; i < vn; i++){cin>>adjList[i].v;}for (int i = 0; i < en; i++){int x, y, w;cin >> x >> y >> w;Node *s = new Node;s->adj = y;s->w = w;s->next = adjList[x].first;adjList[x].first = s;}}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 toptpord(){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();tpord[cnt++] = xx;n--;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->w > ve[yy]){ve[yy] = ve[xx] + p->w;}}}if (!n){return true;}else{return false;}}bool criticPath(){if (!toptpord()) return false;for (int i = 0; i < vn; i++){vl[i] = ve[vn - 1];}for (int i = vn - 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->w < vl[xx]){vl[xx] = vl[yy] - p->w;}}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->w;if (e == l){coll[i] = coll[k] = true;}}}}return true;}void freeTime()//求機(jī)動(dòng)時(shí)間{for (int i = 0; i < vn; i++){int xx = i;for (Node *p = adjList[i].first; p; p = p->next){int yy = p->adj;if (vl[yy] - ve[xx] - p->w > 0){cout << "yy = "<<yy<<" vl[yy] = " << vl[yy] <<" xx = "<<xx<< " ve[xx] = " << ve[xx] << " p->w = " << p->w << endl;cout << xx << " " << yy <<" "<< vl[yy] - ve[xx] - p->w<< endl;}}}cout << endl;}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->w);vis[k] = false;}}}void printPath(){for (int i = 0; i < vn; i++) vis[i] = false;vis[0] = true;dfs(0, 0, 0);}};int main() {AOE g;g.buildAOE();g.criticPath();g.printPath();g.freeTime();return 0; }測試如下:
總結(jié)
以上是生活随笔為你收集整理的C++实现AOE网中的关键路径算法及机动时间计算算法(邻接表存储)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPad 2越狱小教程
- 下一篇: [数据结构]对称矩阵和三角矩阵压缩公式