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的主要内容,如果未能解决你的问题,请参考以下文章

POJ1094[有向环 拓扑排序]

POJ 1094 Sorting It All Out(拓扑排序判环)

POJ 1094 (传递闭包 + 拓扑排序)

POJ 1094 Sorting It All Out

POJ1094 Sorting It All Out

POJ1094 Sorting It All Out