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;
}