1.拓撲排序 (1)舉個例子,要學習某些課程必須先學過一些課程
void topsort(Adgraph* G) { queue<int> Q; int x,count=0; for(int i=1; i<=G->n; i++) if(G->Ad[i].indegree==0) Q.push(i);//入度為0的頂點入隊 while(!Q.empty()) { x=Q.front(); Q.pop(); cout << G->Ad[x].element;//輸出點 count++;//計數器++ link *m=G->Ad[x].firstedge; while(m!=NULL) { if((--G->Ad[m->v].indegree)==0) Q.push(m->v) ; //每當去掉頂點,入度--;如果這時候它變成沒有前驅的頂點,入隊 m=m->next; } } if (count<G->n) cout<<"圖中有環路" << endl; } void topsort(Adgraph* G) { queue<int> Q; int x,count=0; for(int i=1; i<=G->n; i++) if(G->Ad[i].indegree==0) Q.push(i);//入度為0的頂點入隊 while(!Q.empty()) { x=Q.front(); Q.pop(); cout << G->Ad[x].element;//輸出點 count++;//計數器++ link *m=G->Ad[x].firstedge; while(m!=NULL) { if((--G->Ad[m->v].indegree)==0) Q.push(m->v) ; //每當去掉頂點,入度--;如果這時候它變成沒有前驅的頂點,入隊 m=m->next; } } if (count<G->n) cout<<"圖中有環路" << endl; }
2.AOE網絡 (1)AOE是什麼東東?
//Topsort And AOE #include <iostream> #include<stack> #include<queue> #include<cstdio> using namespace std; struct link { int v;//事件編號 int count;//活動的編號 int weight;//活動的時間 link * next; }; struct node { int indegree;//入度 char element;//事件 struct link* firstedge; };//頭結點 struct Adgraph { int n,e; struct node Ad[101]; };//鄰接表 void Create_AOE(struct Adgraph* G) { int k,i,j,t; cin >> G->n >> G->e;//節點和邊 for (k=1; k<=G->n; k++) { cin >> G->Ad[k].element; G->Ad[k].firstedge=NULL; G->Ad[k].indegree=0; }//頭結點的初始化 for(k=1; k<=G->e; k++) { printf("輸入兩個頂點(事件編號),邊的權值(活動時間)\n"); cin >> j >> i >> t; G->Ad[i].indegree++; link* p=new link; p->v=i; p->weight=t; p->next=G->Ad[j].firstedge; G->Ad[j].firstedge=p;//在表頭插入 } printf("AOE網絡構建完成\n-----人家是華麗麗的分割線-----\n打印鄰接表:\n"); for(i=1; i<=G->n; i++) { cout << G->Ad[i].element; link *m=G->Ad[i].firstedge; while(m!=NULL) { printf("->%c,%d",G->Ad[m->v].element,m->weight); m=m->next; } printf("->^\n"); }//鄰接表打印 printf("\n"); } void Criticalpath(Adgraph* G)//G為帶權值的鄰接表 { queue<int> Q; stack<int> S; int i,j,k,count=0,ve[101],vl[101],ae,al; //時間的最早發生時間和最晚發生時間,活動的最早發生時間和最晚發生時間 //m用來計數,判斷是否有回路 for(i=1; i<=G->n; i++)ve[i]=0; //首先每個事件的最早發生時間都為0 for(i=1; i<=G->n; i++) if(G->Ad[i].indegree==0) Q.push(i); //將入度為0的頂點入隊 printf("Topsort:"); while(!Q.empty()) { j=Q.front(); Q.pop(); count++; cout << G->Ad[j].element; S.push(j);//把正序的拓撲序下標列入棧 link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; G->Ad[k].indegree--; if(ve[j] + p->weight > ve[k]) ve[k] = ve[j] + p->weight; if(G->Ad[k].indegree==0) Q.push(k) ; p=p->next; } }//用topsort求最早的發生時間 printf("\n"); if(count<G->n) { printf("有環路!\n"); return; } for(i=1; i<=G->n; i++) //為各事件v(i)的最遲發生時間vl[i]置初值 vl[i]=ve[G->n]; printf("Opp_Topsort:"); while(!S.empty())//按拓撲序列的逆序取頂點 { j=S.top(); S.pop();//出棧 cout << G->Ad[j].element; link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; if((vl[k] - p->weight)<vl[j]) vl[j]=vl[k]-p->weight; //修改vl[j] p=p->next; } } printf("\nActivity<EnventA->EnventB> AE AL Share time Is Criticalpath?:\n"); for(j=1; j<=G->n; j++) //掃描頂點表 { link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; ae=ve[j]; al=vl[k]-p->weight; printf("<事件%c,事件%c>\t\t\t%d\t%d\t%d \t",G->Ad[j].element,G->Ad[k].element,ae,al,al-ae); if(al==ae)//關鍵活動 printf("Yes"); else printf("No"); printf("\n"); p=p->next; } } } int main() { struct Adgraph G; Create_AOE(&G); Criticalpath(&G); return 0; } //Topsort And AOE #include <iostream> #include<stack> #include<queue> #include<cstdio> using namespace std; struct link { int v;//事件編號 int count;//活動的編號 int weight;//活動的時間 link * next; }; struct node { int indegree;//入度 char element;//事件 struct link* firstedge; };//頭結點 struct Adgraph { int n,e; struct node Ad[101]; };//鄰接表 void Create_AOE(struct Adgraph* G) { int k,i,j,t; cin >> G->n >> G->e;//節點和邊 for (k=1; k<=G->n; k++) { cin >> G->Ad[k].element; G->Ad[k].firstedge=NULL; G->Ad[k].indegree=0; }//頭結點的初始化 for(k=1; k<=G->e; k++) { printf("輸入兩個頂點(事件編號),邊的權值(活動時間)\n"); cin >> j >> i >> t; G->Ad[i].indegree++; link* p=new link; p->v=i; p->weight=t; p->next=G->Ad[j].firstedge; G->Ad[j].firstedge=p;//在表頭插入 } printf("AOE網絡構建完成\n-----人家是華麗麗的分割線-----\n打印鄰接表:\n"); for(i=1; i<=G->n; i++) { cout << G->Ad[i].element; link *m=G->Ad[i].firstedge; while(m!=NULL) { printf("->%c,%d",G->Ad[m->v].element,m->weight); m=m->next; } printf("->^\n"); }//鄰接表打印 printf("\n"); } void Criticalpath(Adgraph* G)//G為帶權值的鄰接表 { queue<int> Q; stack<int> S; int i,j,k,count=0,ve[101],vl[101],ae,al; //時間的最早發生時間和最晚發生時間,活動的最早發生時間和最晚發生時間 //m用來計數,判斷是否有回路 for(i=1; i<=G->n; i++)ve[i]=0; //首先每個事件的最早發生時間都為0 for(i=1; i<=G->n; i++) if(G->Ad[i].indegree==0) Q.push(i); //將入度為0的頂點入隊 printf("Topsort:"); while(!Q.empty()) { j=Q.front(); Q.pop(); count++; cout << G->Ad[j].element; S.push(j);//把正序的拓撲序下標列入棧 link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; G->Ad[k].indegree--; if(ve[j] + p->weight > ve[k]) ve[k] = ve[j] + p->weight; if(G->Ad[k].indegree==0) Q.push(k) ; p=p->next; } }//用topsort求最早的發生時間 printf("\n"); if(count<G->n) { printf("有環路!\n"); return; } for(i=1; i<=G->n; i++) //為各事件v(i)的最遲發生時間vl[i]置初值 vl[i]=ve[G->n]; printf("Opp_Topsort:"); while(!S.empty())//按拓撲序列的逆序取頂點 { j=S.top(); S.pop();//出棧 cout << G->Ad[j].element; link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; if((vl[k] - p->weight)<vl[j]) vl[j]=vl[k]-p->weight; //修改vl[j] p=p->next; } } printf("\nActivity<EnventA->EnventB> AE AL Share time Is Criticalpath?:\n"); for(j=1; j<=G->n; j++) //掃描頂點表 { link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; ae=ve[j]; al=vl[k]-p->weight; printf("<事件%c,事件%c>\t\t\t%d\t%d\t%d \t",G->Ad[j].element,G->Ad[k].element,ae,al,al-ae); if(al==ae)//關鍵活動 printf("Yes"); else printf("No"); printf("\n"); p=p->next; } } } int main() { struct Adgraph G; Create_AOE(&G); Criticalpath(&G); return 0; } //Topsort And AOE #include <iostream> #include<stack> #include<queue> #include<cstdio> using namespace std; struct link { int v;//事件編號 int count;//活動的編號 int weight;//活動的時間 link * next; }; struct node { int indegree;//入度 char element;//事件 struct link* firstedge; };//頭結點 struct Adgraph { int n,e; struct node Ad[101]; };//鄰接表 void Create_AOE(struct Adgraph* G) { int k,i,j,t; cin >> G->n >> G->e;//節點和邊 for (k=1; k<=G->n; k++) { cin >> G->Ad[k].element; G->Ad[k].firstedge=NULL; G->Ad[k].indegree=0; }//頭結點的初始化 for(k=1; k<=G->e; k++) { printf("輸入兩個頂點(事件編號),邊的權值(活動時間)\n"); cin >> j >> i >> t; G->Ad[i].indegree++; link* p=new link; p->v=i; p->weight=t; p->next=G->Ad[j].firstedge; G->Ad[j].firstedge=p;//在表頭插入 } printf("AOE網絡構建完成\n-----人家是華麗麗的分割線-----\n打印鄰接表:\n"); for(i=1; i<=G->n; i++) { cout << G->Ad[i].element; link *m=G->Ad[i].firstedge; while(m!=NULL) { printf("->%c,%d",G->Ad[m->v].element,m->weight); m=m->next; } printf("->^\n"); }//鄰接表打印 printf("\n"); } void Criticalpath(Adgraph* G)//G為帶權值的鄰接表 { queue<int> Q; stack<int> S; int i,j,k,count=0,ve[101],vl[101],ae,al; //時間的最早發生時間和最晚發生時間,活動的最早發生時間和最晚發生時間 //m用來計數,判斷是否有回路 for(i=1; i<=G->n; i++)ve[i]=0; //首先每個事件的最早發生時間都為0 for(i=1; i<=G->n; i++) if(G->Ad[i].indegree==0) Q.push(i); //將入度為0的頂點入隊 printf("Topsort:"); while(!Q.empty()) { j=Q.front(); Q.pop(); count++; cout << G->Ad[j].element; S.push(j);//把正序的拓撲序下標列入棧 link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; G->Ad[k].indegree--; if(ve[j] + p->weight > ve[k]) ve[k] = ve[j] + p->weight; if(G->Ad[k].indegree==0) Q.push(k) ; p=p->next; } }//用topsort求最早的發生時間 printf("\n"); if(count<G->n) { printf("有環路!\n"); return; } for(i=1; i<=G->n; i++) //為各事件v(i)的最遲發生時間vl[i]置初值 vl[i]=ve[G->n]; printf("Opp_Topsort:"); while(!S.empty())//按拓撲序列的逆序取頂點 { j=S.top(); S.pop();//出棧 cout << G->Ad[j].element; link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; if((vl[k] - p->weight)<vl[j]) vl[j]=vl[k]-p->weight; //修改vl[j] p=p->next; } } printf("\nActivity<EnventA->EnventB> AE AL Share time Is Criticalpath?:\n"); for(j=1; j<=G->n; j++) //掃描頂點表 { link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; ae=ve[j]; al=vl[k]-p->weight; printf("<事件%c,事件%c>\t\t\t%d\t%d\t%d \t",G->Ad[j].element,G->Ad[k].element,ae,al,al-ae); if(al==ae)//關鍵活動 printf("Yes"); else printf("No"); printf("\n"); p=p->next; } } } int main() { struct Adgraph G; Create_AOE(&G); Criticalpath(&G); return 0; } //Topsort And AOE #include <iostream> #include<stack> #include<queue> #include<cstdio> using namespace std; struct link { int v;//事件編號 int count;//活動的編號 int weight;//活動的時間 link * next; }; struct node { int indegree;//入度 char element;//事件 struct link* firstedge; };//頭結點 struct Adgraph { int n,e; struct node Ad[101]; };//鄰接表 void Create_AOE(struct Adgraph* G) { int k,i,j,t; cin >> G->n >> G->e;//節點和邊 for (k=1; k<=G->n; k++) { cin >> G->Ad[k].element; G->Ad[k].firstedge=NULL; G->Ad[k].indegree=0; }//頭結點的初始化 for(k=1; k<=G->e; k++) { printf("輸入兩個頂點(事件編號),邊的權值(活動時間)\n"); cin >> j >> i >> t; G->Ad[i].indegree++; link* p=new link; p->v=i; p->weight=t; p->next=G->Ad[j].firstedge; G->Ad[j].firstedge=p;//在表頭插入 } printf("AOE網絡構建完成\n-----人家是華麗麗的分割線-----\n打印鄰接表:\n"); for(i=1; i<=G->n; i++) { cout << G->Ad[i].element; link *m=G->Ad[i].firstedge; while(m!=NULL) { printf("->%c,%d",G->Ad[m->v].element,m->weight); m=m->next; } printf("->^\n"); }//鄰接表打印 printf("\n"); } void Criticalpath(Adgraph* G)//G為帶權值的鄰接表 { queue<int> Q; stack<int> S; int i,j,k,count=0,ve[101],vl[101],ae,al; //時間的最早發生時間和最晚發生時間,活動的最早發生時間和最晚發生時間 //m用來計數,判斷是否有回路 for(i=1; i<=G->n; i++)ve[i]=0; //首先每個事件的最早發生時間都為0 for(i=1; i<=G->n; i++) if(G->Ad[i].indegree==0) Q.push(i); //將入度為0的頂點入隊 printf("Topsort:"); while(!Q.empty()) { j=Q.front(); Q.pop(); count++; cout << G->Ad[j].element; S.push(j);//把正序的拓撲序下標列入棧 link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; G->Ad[k].indegree--; if(ve[j] + p->weight > ve[k]) ve[k] = ve[j] + p->weight; if(G->Ad[k].indegree==0) Q.push(k) ; p=p->next; } }//用topsort求最早的發生時間 printf("\n"); if(count<G->n) { printf("有環路!\n"); return; } for(i=1; i<=G->n; i++) //為各事件v(i)的最遲發生時間vl[i]置初值 vl[i]=ve[G->n]; printf("Opp_Topsort:"); while(!S.empty())//按拓撲序列的逆序取頂點 { j=S.top(); S.pop();//出棧 cout << G->Ad[j].element; link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; if((vl[k] - p->weight)<vl[j]) vl[j]=vl[k]-p->weight; //修改vl[j] p=p->next; } } printf("\nActivity<EnventA->EnventB> AE AL Share time Is Criticalpath?:\n"); for(j=1; j<=G->n; j++) //掃描頂點表 { link *p=G->Ad[j].firstedge; while(p!=NULL) { k=p->v; ae=ve[j]; al=vl[k]-p->weight; printf("<事件%c,事件%c>\t\t\t%d\t%d\t%d \t",G->Ad[j].element,G->Ad[k].element,ae,al,al-ae); if(al==ae)//關鍵活動 printf("Yes"); else printf("No"); printf("\n"); p=p->next; } } } int main() { struct Adgraph G; Create_AOE(&G); Criticalpath(&G); return 0; }