POJ 1094 Sorting It All Out【拓扑排序】

题意: 给出一定的大写字母,并依次给出 m 个两两关系,如果在输入关系的过程中发现有环,或已经能确定所有序列的关系,则输出相应的结果,并且以后输入的关系

          不会对当前结果产生影响。

分析: 如果在输入过程每输入一个进行依次拓扑排序,如果排序中出现没有 0 入度的点则说明有环,如果每次找到的 入度为 0  的点均为一个,并且找到n 个,则顺序

         可以被确定。

#include<stdio.h>
#include<string.h>
#define clr(x)memset(x,0,sizeof(x))
int g[30][30];
int d[30];
int res[30];
int n;
int topo()
{
    int i,j,t2=1,tot=0,tmp,top=0;
    int t[30];
    for(i=0;i<n;i++)
        t[i]=d[i];
    for(i=0;i<n;i++)
    {
        tot=0;
        for(j=0;j<n;j++)
            if(t[j]==0)
            {
                tot++;
                tmp=j;
            }
        if(tot==0)
            return 0;
        if(tot>1)
            t2=-1;
        t[tmp]=-1;
        res[top++]=tmp;
        for(j=0;j<n;j++)
            if(g[tmp][j])
                t[j]--;
    }
    return t2;
}
int main()
{
    int m,f1,f2,i,j;
    char s[5];
    while(scanf("%d%d",&n,&m),n||m)
    {
        f1=0;
        clr(g);
        clr(d);
        for(i=1;i<=m;i++)
        {
            scanf("%s",s);
            g[s[0]-'A'][s[2]-'A']=1;
            d[s[2]-'A']++;
            if(f1==0)
                f2=topo();
            if(f2==1&&f1==0)
            {
                printf("Sorted sequence determined after %d relations: ",i);
                for(j=0;j<n;j++)
                    printf("%c",res[j]+'A');
                printf(".\n");
                f1=1;
            }
            if(f2==0&&f1==0)
            {
                printf("Inconsistency found after %d relations.\n",i);
                f1=1;
            }
        }
        if(f1==0)
            printf("Sorted sequence cannot be determined.\n");
    }
    return 0;
}

 

posted @ 2012-08-15 09:22  'wind  阅读(152)  评论(0编辑  收藏  举报