标签:拓扑排序
题意:判断有无环路;
思路:拓扑排序;
两种写法:
结构体+指针:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n,m; struct node{ int du; node *next; }q[50010]; int topo() { node *p; int *shu=new int[50010]; int i,j,k=0,num; while(1) { num=0; memset(shu,0,sizeof(shu)); for(i=0;i<n;i++) { if(q[i].du==-1) continue; if(q[i].du==0) { shu[num++]=i; q[i].du=-1; k++; } } if(num==0&&k<=n) return 0; if(k==n) return 1; for(i=0;i<num;i++) { p=q[shu[i]].next; while(p) { q[p->du].du--; p=p->next; } } } } int main() { int a,b,i,k,j; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(i=0;i<n;i++) { q[i].du=0; q[i].next=NULL; } for(i=0;i<m;i++) { scanf("%d%d",&a,&b); q[a].du++; node *t=new node; t->du=a; t->next=q[b].next; q[b].next=t; } if(topo()) printf("YES\n"); else printf("NO\n"); } return 0; }STL,队列:
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; int con[500010],n,m; vector<int> g[500010]; int topo() { int sum=n; queue<int> q; int flag=0; for(int i=0;i<n;i++) if(con[i]==0) q.push(i); while(!q.empty()) { sum--; int j=q.front(); q.pop(); for(int k=0;k<g[j].size();k++) { if(--con[g[j][k]]==0) q.push(g[j][k]); } } if(sum>0) return 0; else return 1; } int main() { int i,j,k,a,b; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(i=0;i<=n;i++) { con[i]=0; g[i].clear(); } for(i=0;i<m;i++) { scanf("%d%d",&a,&b); g[a].push_back(b); con[b]++; } if(topo()) printf("YES\n"); else printf("NO\n"); } return 0; }
标签:拓扑排序
原文地址:http://blog.csdn.net/dominating413421391/article/details/44260179