POJ 1094 简化的floyd加拓扑排序
http://poj.org/problem?id=1094
题意:第一行n,m。n代表要对字母表前n个字母排序,m代表下面给出m对部分序关系。输出有三种
:当读到某行t能将前n个字母排好序,最后就输出xxxxx;当读到某行t发现有回路,即不能排序时,输出xxxxx;当读完发现无法排序,输出xxxxx。注意:数据要读完后在输出结果。。这个害我wrong了2次啊。。当第一种情况和第二种情况判断能否排序后,之后的输入不做处理。
思路:在每次读入一对数据时,用floyd处理,若有b,即产生了回路;若没有回路继续判断,若每个点的入度和出度之和为n-1,则证明能排序,然后用拓扑排序就好了(题目蛋疼,代码长了。。)。
上代码
1 #include<stdio.h>
2 #include<string.h>
3
4 int main()
5 {
6 int n,m,i,j,k,t;
7 int a[27][27],b[27][27],T[27],p[27];
8 char ch1,ch2,ch3;
9
10 while(scanf("%d%d",&n,&m)!=EOF)
11 {
12 if(n==0&&m==0) break;
13 if(m==0)
14 {
15 printf("Sorted sequence cannot be determined.\n");
16 continue;
17 }
18 int flag1=0,flag2=0;
19 memset(a,0,sizeof(a));
20
21 for(t=1;t<=m;t++)
22 {
23 getchar();
24 scanf("%c%c%c",&ch1,&ch2,&ch3);
25 if(flag1!=0) continue;
26 a[(int)(ch1-'A'+1)][(int)(ch3-'A'+1)]=1;
27
28 for(i=1;i<=n;i++)
29 for(j=1;j<=n;j++)
30 b[i][j]=a[i][j];
31
32 /*判断是否有环*/
33 for(k=1;k<=n;k++)
34 for(i=1;i<=n;i++)
35 for(j=1;j<=n;j++)
36 if(b[i][j]==0&&b[i][k]==1&&b[k][j]==1)
37 b[i][j]=1;
38
39
40 /*用floyd之后某点能回到自己则有环*/
41 for(i=1;i<=n;i++)
42 if(b[i][i]==1)
43 {
44 flag1=1;
45 break;
46 }
47 if(flag1==1)
48 {
49 flag2=t;
50 continue;
51 }
52
53
54 /*若每一点入度出度之和为n-1,则证明可以排序*/
55 int tmp;
56 for(i=1;i<=n;i++)
57 {
58 tmp=0;
59 for(j=1;j<=n;j++)
60 if(b[i][j]==1||b[j][i]==1)
61 tmp++;
62 if(tmp!=n-1) break;
63 }
64 if(tmp!=n-1) continue;
65
66
67 /*拓扑排序*/
68 memset(T,0,sizeof(T));
69 memset(p,0,sizeof(p));
70 k=0;
71 while(1)
72 {
73 for(i=1;i<=n;i++)
74 {
75 if(p[i]==1) continue;
76 tmp=0;
77 for(j=1;j<=n;j++)
78 if(a[j][i]==1)
79 tmp++;
80 if(tmp!=0) continue;
81 for(j=1;j<=n;j++)
82 a[i][j]=0;
83 T[++k]=i;
84 p[i]=1;
85 if(k==n)
86 {
87 flag1=2;
88 break;
89 }
90 }
91 if(k==n) break;
92 }
93
94 if(flag1==2)
95 {
96 flag2=t;
97 continue;
98 }
99 }
100 if(flag1==0)
101 printf("Sorted sequence cannot be determined.\n");
102 if(flag1==2)
103 {
104 printf("Sorted sequence determined after %d relations: ",flag2);
105 for(i=1;i<=n;i++)
106 printf("%c",(char)(T[i]+64));
107 printf(".\n");
108 }
109 if(flag1==1)
110 printf("Inconsistency found after %d relations.\n",flag2);
111 }
112 }

浙公网安备 33010602011771号