poj1094Sorting It All Out(拓扑排序)

题意:明确告诉你多少个点,多少条边,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");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值