拓撲排序模板


三種方法類似,記錄數據和刪除以沒有前驅的頂點為尾的箭頭時有點區別

 1 /*hdu1285--采用二維數組記錄兩者之間的關系*/
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 using namespace std;
 6 int map[510][510];//前驅數量 
 7 int indegree[510];
 8 int queue[510];//保存拓撲序列 
 9 void topo(int n)
10 {
11     int i,j,m,t=0;
12     for(j=1;j<=n;j++){
13         for(i=1;i<=n;i++){
14             if(indegree[i]==0){//找出前驅數量為零的的點即每次找到第一名 
15                 m=i;break;
16             }
17         }
18         queue[t++]=m;indegree[m]=-1;//將第一名的前驅數量設為-1 
19         for(i=1;i<=n;++i){//第二步將前驅中含有第一名的點前驅數量減1 
20             if(map[m][i])indegree[i]--;
21         }
22     }
23     printf("%d",queue[0]);//輸出拓撲序列 
24     for(i=1;i<n;++i){
25         printf(" %d",queue[i]);
26     }
27     printf("\n");
28 }
29 int main()
30 {
31     int n,m,i,j,a,b;
32     while(scanf("%d%d",&n,&m)!=EOF){
33         memset(indegree,0,sizeof(indegree));//初始化 
34         memset(map,0,sizeof(map));
35         for(i=0;i<m;++i){
36             scanf("%d%d",&a,&b);
37             if(map[a][b]==0){ //避免重復的數據輸入 
38                 map[a][b]=1;indegree[b]++;//第一步記錄關系和點的前驅數量 
39             }
40         }
41         topo(n);//調用拓撲排序 
42     }
43     return 0;
44 }
 1 /*hdu1285--采用鄰接表記錄兩者之間的關系*/ 
 2 #include<cstdio>
 3 #include<cstring>
 4 int head[510];
 5 int indegree[510];
 6 int queue[510];
 7 int num;
 8 struct stu{
 9    int to,next;
10 }edge[2510];
11 void inin(){//初始化 
12     memset(indegree,0,sizeof(indegree)); 
13     memset(head,-1,sizeof(head));
14     num=0;
15 }
16 void add(int a,int b){//添加邊 
17    stu E={b,head[a]};
18    edge[num]=E;
19    head[a]=num++;
20    indegree[b]++;
21 }
22 void topo(int n){
23     int i,j,id,t=0;
24     for(j=1;j<=n;j++){
25         for(i=1;i<=n;i++){
26             if(indegree[i]==0){
27               id=i;
28               break;    
29             }
30         }
31         queue[t++]=id;indegree[id]=-1;
32         for(i=head[id];i!=-1;i=edge[i].next){
33             int k=edge[i].to;
34             indegree[k]--;
35         }
36     }
37     printf("%d",queue[0]);//輸出拓撲序列 
38     for(i=1;i<n;++i){
39         printf(" %d",queue[i]);
40     }
41     printf("\n");
42 }
43 int main(){
44     int n,m,i,j,a,b;
45     while(scanf("%d%d",&n,&m)!=EOF){
46         inin();
47         for(i=1;i<=m;i++){
48            scanf("%d%d",&a,&b);
49            add(a,b);
50         }
51         topo(n);
52     }
53     return 0;
54 }
 1 /*hdu1285--采用隊列記錄兩者之間的關系*/ 
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<queue>
 6 #include <functional> 
 7 using namespace std;
 8 int map[510][510];
 9 int indegree[510]; 
10 void topo(int n)
11 {
12     int i,j,m,t=0;
13     priority_queue<int,vector<int>,greater<int> >Q;//按從小到大順序輸出隊
14     for(i=1;i<=n;i++){
15         if(indegree[i]==0){
16              Q.push(i);
17         }
18     }
19     int sign=1;
20     while(!Q.empty()){
21         int top=Q.top();
22         Q.pop();
23         indegree[top]=-1;
24         if(sign)
25             printf("%d",top);
26         else
27             printf(" %d",top);
28         sign=0;
29         for(i=1;i<=n;i++){
30             if(map[top][i]){
31                 indegree[i]--;
32                 if(indegree[i]==0){
33                     Q.push(i);
34                 }
35             }
36         }
37     }
38     printf("\n");
39 }
40 int main()
41 {
42     int n,m,i,j,a,b;
43     while(scanf("%d%d",&n,&m)!=EOF){
44         memset(indegree,0,sizeof(indegree));
45         memset(map,0,sizeof(map));
46         for(i=0;i<m;++i){
47             scanf("%d%d",&a,&b);
48             if(map[a][b]==0){
49                 map[a][b]=1;indegree[b]++;
50             }
51         }
52         topo(n);
53     }
54     return 0;
55 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM