HNU Indiana Jones and the lost Soccer Cup 【拓扑排序】
题意: 有 n 个队伍,给出m 个关系,判断是否有环,或者有多种排序方式,或者排序方式唯一。
分析:拓扑排序,如果在排序过程中出队的次数超过 N 说明有环,否则如果在同一层入队的有多个,则说明有多种情况。
#include<stdio.h> #include<string.h> #include<math.h> #define maxn 10005 #define clr(x)memset(x,0,sizeof(x)) struct node { int to,next; }e[1000005]; int tot; int head[maxn]; void add(int s,int u) { e[tot].to=u; e[tot].next=head[s]; head[s]=tot++; } int out[maxn]; int in[maxn]; int res[maxn]; int n; int q[maxn]; int v[maxn]; int main() { int t,m,i,a,b,front,rear,tt,top; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); tot=1; top=0; memset(head,0,sizeof(head)); memset(in,0,sizeof(in)); while(m--) { scanf("%d%d",&a,&b); add(a,b); in[b]++; } front=rear=0; int f1=1,f2=0; for(i=1;i<=n;i++) if(in[i]==0) q[rear++]=i; if(rear>1) f1=-1; res[top++]=q[rear-1]; int num=0; while(front<rear) { int x=q[front++]; tt=0; num++; tt=0; for(i=head[x];i;i=e[i].next) { in[e[i].to]--; if(in[e[i].to]==0) { q[rear++]=e[i].to; res[top++]=e[i].to; tt++; } } if(tt>1) f2=-1; } if(num!=n) printf("recheck hints\n"); else if(f1==-1||f2==-1) printf("missing hints\n"); else { for(i=0;i<top;i++) printf("%d%c",res[i],i==top-1?'\n':' '); } } return 0; }