POJ1094 Sorting It All Out(拓扑排序)

来源:互联网 发布:windows 10 无声音 编辑:程序博客网 时间:2024/04/30 01:55

题意给你字母表的前N个大写字母和M个大小关系所有的边按顺序给你,要你在能判断出全序或矛盾的时候及时输出答案,或者直到最后也不能出现全序。

思路:这道题卡在怎么在前K个已经能判断出全序了就输出,后来搜到了结论,如果能topo排序就说明没有矛盾,但是可能是全序或者偏序集.如果是全序集,那么topo排序的过程中,入度为0的点始终只会存在1个.


#include <cstdio>#include <queue>#include <cstring>#include <iostream>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <string>#include <set>#include <ctime>#include <cmath>#include <cctype>using namespace std;#define maxn 50#define LL long longint cas=1,T;vector<int>G[maxn];int in[maxn];int n,m;char order[1000][10];char ans[maxn];int cnt;int topo(){cnt=0;queue<int>q;int ind[maxn];memcpy(ind,in,sizeof(in));bool flag=1;for (int i = 0;i<n;i++)if (ind[i]==0)q.push(i);while (!q.empty()){if (q.size()>1)    //q中始终只有一个元素才能保证全序flag=0;int u = q.front();q.pop();ans[cnt++]=u+'A';for (int i = 0;i<G[u].size();i++){           int v = G[u][i];   if (--ind[v]==0)   q.push(v);}}int result=0;if (cnt < n) result = -1;  //存在环else if (flag)result = 1;  //已经全序return result;}int main(){while (scanf("%d%d",&n,&m)!=EOF && n){memset(in,0,sizeof(in));for (int i = 0;i<n;i++)G[i].clear();for (int i = 0;i<m;i++)scanf("%s",order[i]);int flag = 0;int i;for (i = 0;i<m;i++){int u = order[i][0]-'A';int v = order[i][2]-'A';G[u].push_back(v);in[v]++;if ((flag = topo()) !=0)break;}ans[n]=0;if (flag==1)printf("Sorted sequence determined after %d relations: %s.\n",i+1,ans);else if (flag ==0)printf("Sorted sequence cannot be determined.\n");elseprintf("Inconsistency found after %d relations.\n",i+1);}//freopen("in","r",stdin);//scanf("%d",&T);//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);return 0;}

题目

Description

An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.

Input

Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.

Output

For each problem instance, output consists of one line. This line should be one of the following three: 

Sorted sequence determined after xxx relations: yyy...y. 
Sorted sequence cannot be determined. 
Inconsistency found after xxx relations. 

where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence. 

Sample Input

4 6A<BA<CB<CC<DB<DA<B3 2A<BB<A26 1A<Z0 0

Sample Output

Sorted sequence determined after 4 relations: ABCD.Inconsistency found after 2 relations.Sorted sequence cannot be determined.


0 0
原创粉丝点击