poj1094(Sorting It All Out)
题目大意:
输入n,m。n代表有几个大写字母从'A'开始(A、B...)。m代表m对字母的间的关系。通过判断输出数据间的关系。
输出有三种:
一定要理解清楚题目意思! Sorted sequence determined after 4 relations: ABCD. 输入前4个关系后,决定出了一个序列(关系总数可能大于4) Inconsistency found after 2 relations. 输入前2个关系后,冲突出现了(环,关系总数可能大于2) Sorted sequence cannot be determined. 所有关系输入后,序列和冲突均无出现
解题思路:
拓扑排序。最重要的是输出,本来以为题目有问题,后来仔细想了想题目的意思。感觉没有什么不对,弄清楚输出的的意思就不会WA。
方法:每输入一组数据就判断一下情况,因为题目的意思是输出的时候是看你通过第几组数据就可以将所有数据判断出来结果,所以需要每次输入都判别一下。
1.如果通过前面t组数据可以判断出n个字母的的顺序即直接输出
Sorted sequence determined after t relations:....
后面无论输入什么数据,或者形成环都不需要问。
2.如果通过前面t组数据可以判断出n个字母形成环即直接输出
Inconsistency found after t relations.
3.如果输入不出现任何矛盾的问题并且判断不出来字母的顺序即输出:
Sorted sequence cannot be determined.
代码:
1 #include <algorithm> 2 #include <iostream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cstdio> 7 #include <string> 8 #include <bitset> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <list> 14 //#include <map> 15 #include <set> 16 using namespace std; 17 /***************************************/ 18 #define ll long long 19 #define int64 __int64 20 /***************************************/ 21 const int INF = 0x7f7f7f7f; 22 const double eps = 1e-8; 23 const double PIE=acos(-1.0); 24 const int d1x[]= {0,-1,0,1}; 25 const int d1y[]= {-1,0,1,0}; 26 const int d2x[]= {0,-1,0,1}; 27 const int d2y[]= {1,0,-1,0}; 28 const int fx[]= {-1,-1,-1,0,0,1,1,1}; 29 const int fy[]= {-1,0,1,-1,1,-1,0,1}; 30 /***************************************/ 31 void openfile() 32 { 33 freopen("data.in","rb",stdin); 34 freopen("data.out","wb",stdout); 35 } 36 /**********************华丽丽的分割线,以上为模板部分*****************/ 37 38 int map[50][50]; 39 int cnt[50]; 40 int cnt1[50]; 41 int top[50]; 42 int vis[50]; 43 int n,m; 44 int ce1; 45 int flag; 46 int topo(int txt) 47 { 48 int i,j,k; 49 int sum=0; 50 int d=0; 51 int ce4=0; 52 memset(top,0,sizeof(top)); 53 for(i=0; i<n; i++) 54 { 55 for(sum=0,j=0; j<n; j++) 56 { 57 if (!cnt[j]) 58 sum++; 59 } 60 if (sum>1) 61 { 62 ce4=1; 63 // if (txt+1==m) 64 // printf("Sorted sequence cannot be determined.\n"); 65 // return 0; 66 } 67 for(j=0; j<n; j++) 68 { 69 if (!cnt[j]) 70 { 71 cnt[j]=-1; 72 top[d++]=j; 73 for(k=0; k<n; k++) 74 { 75 if (map[j][k]) 76 { 77 cnt[k]--; 78 } 79 } 80 break; 81 } 82 } 83 } 84 if(ce4&&d==n) 85 return 0; 86 ce1=txt+1; 87 if (d==n) 88 { 89 flag=1; 90 return 0; 91 } 92 flag=2; 93 //if(txt+1==m) 94 // printf("Inconsistency found after %d relations.\n",txt+1); 95 return 0; 96 } 97 int main() 98 { 99 while(scanf("%d%d",&n,&m)&&(n+m)) 100 { 101 int i,j; 102 char a,b,c; 103 int x,y; 104 memset(map,0,sizeof(map)); 105 memset(vis,0,sizeof(vis)); 106 memset(cnt,0,sizeof(cnt)); 107 memset(cnt1,0,sizeof(cnt1)); 108 for(i=0; i<n; i++) 109 cnt[i]=0; 110 int ce; 111 ce1=0; 112 flag=0; 113 for(i=0; i<m; i++) 114 { 115 getchar(); 116 scanf("%c%c%c",&a,&b,&c); 117 x=a-'A'; 118 y=c-'A'; 119 if (map[x][y]==0) 120 { 121 map[x][y]=1; 122 cnt1[y]++; 123 } 124 for(j=0; j<n; j++) 125 cnt[j]=cnt1[j]; 126 if(!ce1) 127 topo(i); 128 } 129 if (flag==1) 130 { 131 printf("Sorted sequence determined after %d relations: ",ce1); 132 for(i=0; i<n; i++) 133 printf("%c",top[i]+'A'); 134 printf(".\n"); 135 continue; 136 } 137 if (flag==2) 138 { 139 printf("Inconsistency found after %d relations.\n",ce1); 140 continue; 141 } 142 printf("Sorted sequence cannot be determined.\n"); 143 } 144 return 0; 145 }
屌丝终有逆袭日,*******。