拓扑排序

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 }

 

以上是关于拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章

拓扑排序代码:

使用 C# 代码实现拓扑排序

UVA10305 拓扑排序

【数据结构】请写出以下AOV网的拓扑排序序列

数据结构问题~啥图可以进行拓扑排序~啥图不能进行拓扑排序?

拓扑排序之变量序列代码