题意相当的坑爹,才开始我的步骤是:
1 判断是否有环,如果存在环,就输出Inconsistency found after 2 relations.不能确定该序列大小
2 如果不存在环,然后判断是否能够判断出唯一的该序列,每次去入读为0的点时,一定会有一个,而且最终取完。。。
3 然后判断。
可是Discuss里面的数据就是不过。。。于是看了看讨论。
原来,只要在出现环之前,能够判断出该序列的顺序就输出顺序,后面的就只输入不处理了(不管了)。。。
还有判断环的优先级要高于序列唯一性判断的优先级。。。
这样的话要每输入一条边,就要进行一次拓扑排序,然后判断是否能够确定该唯一的序列,以及是否存在环。。。如果输入完毕,两个都未确定,则表明,序列无法确定。。
View Code
#include#include #include #define maxn 30 using namespace std; int map[maxn][maxn],ind[maxn]; char as[maxn]; int n,m; int topor() { int i,j,k; bool flag; memset(ind,0,sizeof(ind)); for (i = 1; i <= n; ++i) { for (j = 1; j <= n; ++j) { if (map[i][j]) ind[j]++; } } flag = false;//判断是否存在多个入度为0的点 memset(as,0,sizeof(as)); for (k = 0; k < n; ++k) { i = 0; for (j = 1; j <= n; ++j) { if (ind[j] == 0) { if (i == 0)//判断入度为0的点就一个 i = j; else//出现多个 flag = true; } } if (i == 0) return 1;//没有入度为0的点 as[k] = i + 'A' - 1; ind[i] = -1; for (j = 1; j <= n; ++j) { if (map[i][j]) ind[j]--; } } if (!flag) return 0; else return 2; } int main() { //freopen("d.txt","r",stdin); int i,j; char s[10]; while (cin>>n>>m) { if (!n && !m) break; for (i = 0; i <= n; ++i) { for (j = 0; j <= n; ++j) { map[i][j] = 0; } } bool flag = false;//判断是否可以确定唯一序列 for (i = 1; i <= m; ++i) { scanf("%s",s); if (flag) continue;//如果确定了序列顺序或者存在环后面的就不管了 int a = s[0] - 'A' + 1; int b = s[2] - 'A' + 1; map[a][b] = 1; int mark = topor(); if (mark == 0) { printf("Sorted sequence determined after %d relations: %s.\n",i,as); flag = true; } else if (mark == 1) { printf("Inconsistency found after %d relations.\n",i); flag = true; } } //否则 if (!flag) { printf("Sorted sequence cannot be determined.\n"); } } return 0; }