图的拓扑排序

Posted Altria Pendragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的拓扑排序相关的知识,希望对你有一定的参考价值。

太简单了不写“笔记”了

图的拓扑排序

 1 //注:大部分拓扑排序的题都需要SPJ,因为不同的数据结构的原因,拓扑排序有很多种输出。
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<cmath>
 7 #include<queue>
 8 using namespace std;
 9 struct edge{
10     int v,next;
11 }a[1000001];
12 int n,s,tot=0,head[100001],num[100001];
13 void add(int u,int v){
14     num[v]++;
15     a[++tot].v=v;
16     a[tot].next=head[u];
17     head[u]=tot;
18 }
19 void dfs(int u){
20     int v;
21     priority_queue<int,vector<int>,greater<int> >q;//这里用queue、stack都行
22     for(int i=1;i<=u;i++){
23         if(num[i]==0){
24             num[i]--;
25             q.push(i);
26         }
27     }
28     while(!q.empty()){
29         v=q.top();
30         q.pop();
31         printf("%d ",v);
32         for(int tmp=head[v];tmp!=-1;tmp=a[tmp].next){
33             num[a[tmp].v]--;
34             if(num[a[tmp].v]==0)q.push(a[tmp].v);
35         }
36     }
37 }
38 int main(){
39     memset(head,255,sizeof(head));
40     memset(num,0,sizeof(num));
41     scanf("%d",&n);
42     for(int i=1;i<=n;i++){
43         scanf("%d",&s);
44         while(s){
45             add(i,s);
46             scanf("%d",&s);
47         }
48     }
49     dfs(n);
50     return 0;
51 }

 

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

图的拓扑排序是否不唯一的?

图的应用——拓扑排序(判断有向图有无回路)

图的遍历:拓扑排序

一个有向无环图的拓扑排序序列是否唯一的

图的拓扑排序

图的拓扑排序