图的拓扑排序
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 }
以上是关于图的拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章