POJ-1094-Sorting It All Out
题目链接 http://poj.org/problem?id=1094
题目大意:
一共有N个变量,给出M个关系
1.如果给出关系之间有矛盾,则输出
Inconsistency found after D relations.
其中D为在给出的第D中关系中发现有矛盾
2.如果没有矛盾并且在前d个关系中找出所有变量之间的大小关系,则输出:
Sorted sequence determined after d relations: ABCD.
ABCD 表示 A < B < C < D
也就是说如果我们在第6个关系后知道
A < C < D < B
那我们输出的就是
Sorted sequence determined after 6 relations: ACDB.
3.如果没有矛盾但是却判断不出所有变量的大小关系,则输出:
Sorted sequence cannot be determined.
唯一拓扑序问题。将入度为0的点放入答案数组,如果可以得出关系则输出就可。
根据题目大意可以看出,给定一组字母大小关系后需要依次判断:
1、该序列字母间是否有矛盾,即是否能形成环
2、该序列字母是否有序,若有序则输出
3、该序列无序
我们判断完前两步后已经遍历完整个图才可以确定第三步,并且当1、2得出结果后(有矛盾或者有序且输出),后面的输入不再起作用。
放AC代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 int mapp[26][26],in[26],temp[26],ans[26]; 5 char s[5]; 6 7 int toupu() 8 { 9 int now,tail=-1,flag=1; 10 for(int i=0; i<n; i++) 11 {//后面会修改入度数,所以将每个点的入度用临时数组保存 12 temp[i]=in[i]; 13 } 14 for(int i=0; i<n; i++) 15 {//把每个入度为0的点删除,遍历n个点 16 int num=0;//入度为0的点的个数 17 for(int j=0; j<n; j++) 18 { 19 if(temp[j]==0) 20 { 21 now=j; 22 num++; 23 } 24 } 25 26 if(num==0) return -1;//没有入度为0的点证明存在环,关系矛盾,直接退出 27 if(num>1) flag=0;//有大于一个入度为0的点,但无法判断出关系,可能有环存在还没有判断到 28 29 ans[++tail]=now; 30 temp[now]=-1;//标记此点已被判断过,避免重复判断 31 for(int k=0; k<n; k++) 32 {//入度-1 33 if(mapp[now][k]==1) 34 temp[k]--; 35 } 36 } 37 return flag; 38 } 39 40 int main() 41 { 42 while(scanf("%d%d",&n,&m)!=EOF) 43 { 44 memset(mapp,0,sizeof(mapp)); 45 memset(in,0,sizeof(in)); 46 if(n==0 && m==0) return 0; 47 int sign=0;//若sign=1表示已经确定并输出结果 48 49 for(int i=0; i<m; i++) 50 { 51 scanf("%s",s); 52 if(sign) continue;//已经输出结果,不再对后面的输入做处理 53 int a=s[0]-'A'; 54 int b=s[2]-'A'; 55 mapp[a][b]=1; 56 in[b]++; 57 58 int flag=toupu();//每给出一条边就要重新判断三个条件,判断当前已知条件能否得出结果 59 if(flag==-1) 60 {//关系矛盾 61 printf("Inconsistency found after %d relations.\n",i+1); 62 sign=1; 63 } 64 else if(flag) 65 {//可得关系 66 printf("Sorted sequence determined after %d relations: ",i+1); 67 for(int i=0; i<n; i++) 68 printf("%c",ans[i]+'A'); 69 printf(".\n"); 70 sign=1; 71 } 72 } 73 if(sign==0)//无法得出关系 74 printf("Sorted sequence cannot be determined.\n"); 75 } 76 return 0; 77 }