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;
}

 

posted @ 2012-09-01 14:14  'wind  阅读(226)  评论(0编辑  收藏  举报