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 }

 

posted @ 2022-05-25 14:01  爱吃虾滑  阅读(34)  评论(0)    收藏  举报