拓扑排序
Posted 浮生缘,半生梦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拓扑排序相关的知识,希望对你有一定的参考价值。
编程语言:c++
代码如下:
1 #include<cmath> 2 #include<cstdio> 3 #include<algorithm> 4 #include<stack> 5 #include<memory.h> 6 #include<iostream> 7 using namespace std; 8 #define MAX 9999 9 10 stack<int>mystack; 11 int indegree[MAX]; 12 13 struct node 14 { 15 int adjvex; 16 node* next; 17 }adj[MAX]; 18 19 int Create(node adj[],int n,int m)//邻接表建表函数,n代表定点数,m代表边数 20 { 21 int i; 22 node *p; 23 for(i=1;i<=n;i++) 24 { 25 26 adj[i].adjvex=i; 27 adj[i].next=NULL; 28 } 29 for(i=1;i<=m;i++) 30 { 31 cout<<"请输入第"<<i<<"条边:"; 32 int u,v; 33 cin>>u>>v; 34 p=new node; 35 p->adjvex=v; 36 p->next=adj[u].next; 37 adj[u].next=p; 38 } 39 return 1; 40 } 41 42 43 void print(int n)//邻接表打印函数 44 { 45 int i; 46 node *p; 47 for(i=1;i<=n;i++) 48 { 49 p=&adj[i]; 50 while(p!=NULL) 51 { 52 cout<<p->adjvex<<‘ ‘; 53 p=p->next; 54 } 55 cout<<endl; 56 } 57 } 58 59 void topsort(node adj[],int n) 60 { 61 62 int i; 63 node *p; 64 memset(indegree,0,sizeof(indegree)); 65 for(i=1;i<=n;i++) 66 { 67 68 p=adj[i].next; 69 while(p!=NULL) 70 { 71 indegree[p->adjvex]++; 72 p=p->next; 73 } 74 } 75 for(i=1;i<=n;i++) 76 { 77 78 if(indegree[i]==0) 79 mystack.push(i); 80 } 81 int count=0; 82 while(mystack.size()!=0) 83 { 84 85 i=mystack.top(); 86 mystack.pop(); 87 cout<<i<<‘ ‘; 88 count++; 89 for(p=adj[i].next;p!=NULL;p=p->next) 90 { 91 int k=p->adjvex; 92 indegree[k]--; 93 if(indegree[k]==0) 94 mystack.push(k); 95 } 96 } 97 cout<<endl; 98 if(count<n)cout<<"有回路"<<endl; 99 } 100 101 int main() 102 { 103 int n; 104 int m; 105 cout<<"请输入顶点数及边数:"; 106 cin>>n>>m; 107 Create(adj,n,m); 108 cout<<"输入的邻接表为:"<<endl; 109 print(n); 110 cout<<"拓扑排序结果为:"<<endl; 111 topsort(adj,n); 112 system("pause"); 113 return 0; 114 }
以上是关于拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章