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 }
复制代码

 

posted @   一个_小菜鸟  阅读(297)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示