这一道题的话 数据有一点问题 ........ 例如 不过 还是 能理解一下 试试吧 .........
3 5 A<B B<C C<A A<C B<A 这几组数据 明显反映出来 这是成环的 , 然后 按照 输入输出案例来说 这个是 有序的 ABC
题目要求 在每组数据的 第一行 给你需要排序 的 字母数 和 他们之间的关系数量 然后 输入每组数据 你首先许亚萍判断在输入 第几组 数据的时候 出现了 环 其次判断 到第几组关系的时候 可以确定唯一的序列 如果上面两个 都不行的话 就输出 第三种情况 不能确定 唯一 的 排序序列
1 #include<stdio.h> 2 #include<string.h> 3 int map[27][27],indegree[27],q[27]; 4 int TopoSort(int n) //拓扑排序 5 { 6 int c=0,temp[27],loc,m,flag=1,i,j; ////flag=1:有序 flag=-1:不确定 7 for(i=1;i<=n;i++) 8 temp[i]=indegree[i]; 9 for(i=1;i<=n;i++) 10 { 11 m=0; 12 for(j=1;j<=n;j++) 13 if(temp[j]==0) { m++; loc=j; } //查找入度为零的顶点个数 14 if(m==0) return 0; //有环 15 if(m>1) flag=-1; // 无序 16 q[c++]=loc; //入度为零的点入队 17 temp[loc]=-1; 18 for(j=1;j<=n;j++) 19 if(map[loc][j]==1) temp[j]--; 20 } 21 return flag; 22 } 23 24 int main() 25 { 26 int m,n,i,sign; //当sign=1时,已得出结果 27 char str[5]; 28 while(scanf("%d%d",&n,&m)) 29 { 30 if(m==0&&n==0) break; 31 memset(map,0,sizeof(map)); 32 memset(indegree,0,sizeof(indegree)); 33 sign=0; 34 for(i=1;i<=m;i++) 35 { 36 scanf("%s",str); 37 if(sign) continue; //一旦得出结果,对后续的输入不做处理 38 int x=str[0]-‘A‘+1; 39 int y=str[2]-‘A‘+1; 40 map[x][y]=1; 41 indegree[y]++; 42 int s=TopoSort(n); 43 if(s==0) //有环 44 { 45 printf("Inconsistency found after %d relations.\n",i); 46 sign=1; 47 } 48 if(s==1) //有序 49 { 50 printf("Sorted sequence determined after %d relations: ",i); 51 for(int j=0;j<n;j++) 52 printf("%c",q[j]+‘A‘-1); 53 printf(".\n"); 54 sign=1; 55 } 56 } 57 if(!sign) //不确定 58 printf("Sorted sequence cannot be determined.\n"); 59 } 60 return 0; 61 }
时间: 2024-10-23 06:04:34