题目链接:http://poj.org/problem?id=1094
题目大意:给你的m种大小情况对n个字母进行拓扑排序,严格的说是能不能给出特定的顺序,这题主要是判断的先后顺序,先判断有没有环,如果有环的话先输出存在环,如果有确定结果的话输出结果,如果都没有的话输出不确定。
本题坑点就是判断顺序,加标记什么的,代码又是写的又臭又长。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int maxn = 26+5;
int a[maxn][maxn];
int in[maxn], in_tmp[maxn];
int n, m, cnt;
int ans[maxn];
bool is_have_huan, is_have_end;
void topo()
{
for (int i = 0; i < n; i++) {
int flag = 0;
int num = 0;
for (int j = 0; j < n; j++) {
if (in_tmp[j] == 0) num++;
if(num > 1) is_have_end = 0;
}
for (int j = 0; j < n; j++) {
if (in_tmp[j] == 0) {
flag = 1;
ans[cnt++] = j;
flag = 1;
in_tmp[j]--;
for (int k = 0; k < n; k++)
if (a[j][k]) in_tmp[k]--;
break;
}
}
if (flag == 0) {
is_have_huan = 1;
return;
}
}
return;
}
int main()
{
//freopen("in", "r", stdin);
while (cin >>n >> m) {
if (n == 0 && m == 0) break;
memset(a, 0, sizeof(a));
memset(in, 0, sizeof(in));
int is_end = 0;
for (int i = 1; i <= m; i++) {
char x, y;
scanf(" %c<%c", &x, &y);
if (a[x-'A'][y-'A'] == 0) {
a[x-'A'][y-'A'] = 1;
in[y-'A']++;
}
if (!is_end) {
cnt = 0;
is_have_huan = 0;
is_have_end = 1;
memcpy(in_tmp, in, sizeof(in));
topo();
if (is_have_huan) {
printf("Inconsistency found after %d relations.\n", i);
is_end = 1;
}
else if (is_have_end) {
printf("Sorted sequence determined after %d relations: ", i);
for (int j = 0; j < n; j++) printf("%c", ans[j]+'A');
cout << ".";
cout << endl;
is_end = 1;
}
}
}
if (!is_end) printf("Sorted sequence cannot be determined.\n");
}
return 0;
}