您的位置:首页 > 其它

poj-1094 Sorting It All Out

2016-01-26 19:19 344 查看
题意:给定一组大小关系,判断是否能够确定有唯一的拓扑序列。

输出格式有三种:1. 有唯一的拓扑序列,依次输出。

2. 该序列不能判断是否有序。

3. 出现矛盾,即出现环。

输出格式的判断也有一定的先后顺序:先判断3 然后判断1 最后是2。 判断2时要遍历完整个图才能下结论。 而对于1,3一旦出现结果就可以输出,接下来的输入就可以忽略。

每组输入进行一次拓扑排序。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
int indegree[30];
int Mp[30][30];//i--->j
int ans[30];
int index;
//拓扑排序
int TopoSort(int n)
{
stack<int> sta;
int flag=1;
int tem[30];
for (int i = 1; i <= n; i++)
tem[i] = indegree[i];//避免对indgree数组产生影响
index = 0;
for (int i = 1; i <= n; i++)
if (tem[i] == 0) sta.push(i);
while (!sta.empty())
{
if (sta.size() > 1) flag=0;//序列不确定。不能直接return ,后面可能还有环出现
int cnt = sta.top();
sta.pop();
ans[index++] = cnt;
for (int i = 1; i <= n;i++)
if (Mp[cnt][i])
{
if (--tem[i]==0)
sta.push(i);
}
}
if (index != n) return -1;//有环
if (flag == 0) return 0;//不确定
else return 1;//唯一确定
}
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) != EOF)
{
if (n == 0 && m == 0) break;
bool isok = false;//是否已经产生结果
char str[10];
memset(indegree, 0, sizeof indegree);
memset(Mp, 0, sizeof Mp);
for (int i = 1; i <= m; i++)
{
scanf("%s", str);
int u = str[0] - 'A' + 1;
int v = str[2] - 'A' + 1;
Mp[u][v] = 1;
indegree[v]++;
if (isok) continue;//
int flag = TopoSort(n);
if (flag == 1)
{
//OK
isok = true;
printf("Sorted sequence determined after %d relations: ", i);
for (int j = 0; j < n; j++)
{
printf("%c", ans[j] - 1 + 'A');
}
printf(".\n");
}
else if (flag == -1)
{
//circle
printf("Inconsistency found after %d relations.\n", i);
isok = true;
}
}
if (isok == false)
{
//uncertain
printf("Sorted sequence cannot be determined.\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: