POJ1094Sorting It All Out

分析:这题需要考虑的方面比较多

需要考虑到环,唯一的拓扑序列,不唯一的拓扑序列,还需要输出在第几组数据之后知道有环或唯一的拓扑序列,并且输出唯一的拓扑序列

因此需要对每组数据的输入进行拓扑序列

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 30
using namespace std;
int n,m;
int degree[MAXN],temp[MAXN];
int q[MAXN];int iq;
struct eee{
    int v,next;
}edge[MAXN*MAXN];
int e,first[MAXN];
void add(int u,int v){
    edge[e].v=v;
    edge[e].next=first[u];
    first[u]=e++;
}
void init(){
    memset(first,-1,sizeof(first));
    memset(degree,0,sizeof(degree));
    e=0;
}
//拓扑排序
int toposort(){
    int mult=0;
    iq=0;
      for(int i=0;i<n;i++){
      temp[i]=degree[i];
    }
    for(int i=0;i<n;i++){
        if(temp[i]==0){
            q[iq++]=i;
        }
    }
    if(iq>1)mult=1;
    for(int i=0;i<iq;i++){
        int u=q[i];
        int k=0;
        for(int j=first[u];j!=-1;j=edge[j].next){
            int v=edge[j].v;
            temp[v]--;
            if(temp[v]==0){
                k++;
                q[iq++]=v;
            }
        }
        if(k>1)mult=1;
    }
    if(iq!=n)return 2;
    else if(mult)return 1;
    else return 3;
}
int main()
{
    freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&n,&m)){
        if(n==0&&m==0)break;
        init();
        char a[5];
         int sure=0,no=0;
        for(int i=0;i<m;i++){
            scanf("%s",a);
            degree[a[2]-'A']++;
            add(a[0]-'A',a[2]-'A');
            int result=toposort();
            //result=1表示拓扑序列不唯一,result=2表示有环,result=3表示有唯一的拓扑序列
            if(result==2&&!no&&!sure){
                printf("Inconsistency found after %d relations.\n",i+1);
                no=1;
            }
            if(result==3&&!sure){
            printf("Sorted sequence determined after %d relations: ",i+1);
            for(int i=0;i<n;i++){
                printf("%c",q[i]+'A');
            }
            printf(".\n");
            sure=1;
            }
        }
        if(!no&&!sure)
        printf("Sorted sequence cannot be determined.\n");

    }
    return 0;
}
原文地址:https://www.cnblogs.com/arbitrary/p/2714199.html