poj 1094(拓扑排序)

http://poj.org/problem?id=1094

题意:给你m个字母,有n个判断语句。求在哪个语句就可以判断出这个是不是一个环,或者在哪个语句可以判断出这些字母的排序规则,或者就是不能确定。

思路:每输入一次,进行一次排序,看会不会构成环或者已经可以确定了判断规则。

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 char ans[30];
 5 
 6 int indegree[27];
 7 
 8 bool mp[26][26];
 9 
10 int topsort(int n)
11 {
12     int i,j,m,flag,c=0,tmp[27],l=1;
13     for(i=0;i<n;i++)
14         tmp[i]=indegree[i];
15     for(i=0;i<n;i++)
16     {
17         m=0;
18         for(j=0;j<n;j++)
19             if(tmp[j]==0) {m++;flag=j;}
20         if(m==0) return 0;    //如果全部的度都是0的话,那么说明有环。
21         ans[c++]=flag+'A';
22         if(m>1) l=-1;      //这个不能用return -1,因为成环不一定是要成一个大环,可以几个字母成一个小环。
23         tmp[flag]--;
24         for(j=0;j<n;j++)
25             if(mp[flag][j]) tmp[j]--;
26     }
27     return l;
28 }
29 
30 int main()
31 {
32     freopen("in.txt","r",stdin);
33     int m,n,sign;
34     char inp[4];
35     while(scanf("%d%d",&m,&n),m||n)
36     {
37         memset(mp,false,sizeof(mp));
38         memset(indegree,0,sizeof(indegree));
39         sign=0;
40         for(int i=1;i<=n;i++)
41         {
42             scanf("%s",inp);
43             if(sign) continue;
44             mp[inp[0]-'A'][inp[2]-'A']=true;
45             indegree[inp[2]-'A']++;
46             int s=topsort(m);
47             if(s==0)
48             {
49                 printf("Inconsistency found after %d relations.\n",i);
50                 sign=1;
51             }
52             else if(s==1)
53             {
54                 printf("Sorted sequence determined after %d relations: ",i);
55                 for(int j=0;j<m;j++)
56                     printf("%c",ans[j]);
57                 printf(".\n");
58                 sign=1;
59             }
60         }
61         if(!sign)
62             printf("Sorted sequence cannot be determined.\n");
63     }
64     return 0;
65 }

 

转载于:https://www.cnblogs.com/Tree-dream/p/5726348.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值