pku 1094 Sorting It All Out ——拓扑排序

http://poj.org/problem?id=1094

题意相当的坑爹,才开始我的步骤是:

1 判断是否有环,如果存在环,就输出Inconsistency found after 2 relations.不能确定该序列大小

2 如果不存在环,然后判断是否能够判断出唯一的该序列,每次去入读为0的点时,一定会有一个,而且最终取完。。。

3 然后判断。

可是Discuss里面的数据就是不过。。。于是看了看讨论。

原来,只要在出现环之前,能够判断出该序列的顺序就输出顺序,后面的就只输入不处理了(不管了)。。。

还有判断环的优先级要高于序列唯一性判断的优先级。。。

这样的话要每输入一条边,就要进行一次拓扑排序,然后判断是否能够确定该唯一的序列,以及是否存在环。。。如果输入完毕,两个都未确定,则表明,序列无法确定。。

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#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;
}



 

你可能感兴趣的:(sort)