poj1094Sorting It All Out(拓扑排序)

来源:互联网 发布:eclipse maven mac 编辑:程序博客网 时间:2024/05/17 14:28

题意:明确告诉你多少个点,多少条边,a<b可以看做,a连向b.问你能不能构成拓扑排序。

有点不同时,这里判断是一条一条加入图中,如果已经构成一个唯一的拓扑排序,后面的边就忽略(不造有这个关系W了好多次),并输出到第几条边构成拓扑排序,当然很容易想到如果一条一条检测时已构成环,也可以直接判断此图无法构成拓扑排序,输出从第几条边输入时就不能构成拓扑排序。最后只有把所有边输入完后并没有出现以上情况,才能判断构成的拓扑排序是不是唯一的。

#include<cstring>#include<cstdio>#include<iostream>using namespace std;const int Maxn=30;int n,m,M[Maxn][Maxn],ans[Maxn],num[Maxn];int toposort(){   memset(num,0,sizeof(num));   for(int i=0;i<n;i++)    for(int j=0;j<n;j++)    if(M[i][j]==1) num[j]++;   int t=0,flag=1,select;   for(int i=0;i<n;i++)   {       int cnt=0;       for(int j=0;j<n;j++)       if(num[j]==0) {select=j;cnt++;}       if(cnt==0) return 0;       if(cnt>1) flag=2;       num[select]=-1;       ans[t++]=select;       for(int j=0;j<n;j++)        if(M[select][j]==1) num[j]--;   }   return flag;}int main(){    while(~scanf("%d %d",&n,&m)&&n&&m)    {        int sign=0,s;        memset(M,0,sizeof(M));       // memset()        char str[5];        for(int i=0;i<m;i++)        {            scanf("%s",str);            M[str[0]-'A'][str[2]-'A']=1;            if(sign) continue;            s=toposort();            if(s==0)            {                printf("Inconsistency found after %d relations.\n",i+1);                sign=1;            }            if(s==1)            {                printf("Sorted sequence determined after %d relations: ",i+1);                for(int j=0;j<n;j++)                    printf("%c",ans[j]+'A');                printf(".\n");                sign=1;            }        }        if(!sign)           printf("Sorted sequence cannot be determined.\n");    }}


0 0
原创粉丝点击