POJ1094
Posted Blogggggg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ1094相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=1094
解题思路:
思路来源于网络。
唉,说到底对于图论的理解还是太浅了。
A<B可以看成A-->B,这样就不难把问题转换成一个拓扑排序了。把每一个不等式看成一条边,逐一往图中加边,每加入一条边检查一次。
1、建一个队列,像 bfs 那样,让所有入度为 0 的点入队。对于每一个入度为 0 的点,与它相连的所有点的入度全部 -1,然后继续让所有入度为 0 的未访问过的点入队;
2、任何时刻,一旦发现队列中有多个点,就说明直到目前为止,仍然没有唯一解;
3、最精彩的一点!在所有元素都出队以后,计算遍历过的所有元素的总数量p,一旦发现 p<n ,就说明这个有向图有环!仔细想想:对于形成环的点来说,它们的入度是不可能为0的,所以,如果图中有环,那么环中的点就不会被遍历到,那么我们遍历到的元素总数量就会小于n。在下拜服!
其他的还有一些细节,请看代码注释。
AC代码:
1 #include <cstdio> 2 #include <vector> 3 using namespace std; 4 5 vector<int> out[30]; 6 int in[30],tin[30]; 7 int n,m; 8 char ans[10000]; 9 int topu(){ 10 int ret=1; 11 int que[10000]; 12 int head=0,ending=0; 13 for(int i=0;i<n;i++){ 14 tin[i]=in[i]; //用tin[]暂时代替in[] 15 if(tin[i]==0){ 16 que[ending]=i; 17 ending++; 18 } 19 } 20 int p=0; 21 while(ending>head){ 22 if(ending>head+1) ret=0; //0代表暂时无唯一解 23 ans[p++]=que[head]+‘A‘; 24 for(int i=0;i<out[que[head]].size();i++){ 25 tin[out[que[head]][i]]--; 26 if(tin[out[que[head]][i]]==0){ 27 que[ending]=out[que[head]][i]; 28 ending++; 29 } 30 } 31 head++; 32 } 33 ans[p]=‘\0‘; 34 if(p<n) ret=-1; //-1代表有环,有环就有矛盾 35 return ret; 36 } 37 int main(){ 38 char temp[5]; 39 while(scanf("%d%d",&n,&m)==2&&(n||m)){ 40 for(int i=0;i<n;i++){ 41 in[i]=0; //记录每个点的入度 42 out[i].clear(); //记录从各个点出发所连接的点 43 } 44 bool flag=false; //记录是否已经得出结论 45 for(int t=1;t<=m;t++){ 46 scanf("%s",temp); 47 if(flag) continue; //如果已经得出结论,那么就不必继续加边检验了 48 in[temp[2]-‘A‘]++; 49 out[temp[0]-‘A‘].push_back(temp[2]-‘A‘); 50 int tt=topu(); 51 if(tt==-1){ 52 flag=true; 53 printf("Inconsistency found after %d relations.\n",t); 54 } 55 else if(tt==1){ 56 flag=true; 57 printf("Sorted sequence determined after %d relations: %s.\n",t,ans); 58 } 59 } 60 if(!flag) printf("Sorted sequence cannot be determined.\n"); 61 } 62 return 0; 63 }
以上是关于POJ1094的主要内容,如果未能解决你的问题,请参考以下文章