题目链接:http://poj.org/problem?id=1094
注意拓扑排序要先判断是否存在环,再判断是否唯一
#include<iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include<stdlib.h>
#include <string.h>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<time.h>
using namespace std;
#define MAX_N 30
#define inf 0x7fffffff
#define LL long long
#define ull unsigned long long
const LL INF = 9e18;
const int mod = 100000000;
typedef pair<double, double>P;
int n, m;
int inDegree[MAX_N];
vector<int>G[MAX_N];
stack<int>S;
void init()
{
for(int i=0;i<n;i++)
inDegree[i] = 0, G[i].clear();
}
bool topSort(int k)
{
while(!S.empty())
S.pop();
int inDe[MAX_N];
int ans[MAX_N];
int total = 0;
for(int i=0;i<n;i++)
inDe[i] = inDegree[i];
for(int i=0;i<n;i++) {
if(!inDe[i])
S.push(i);
}
bool f = false;
while(!S.empty()) {
if(S.size() >= 2)
f = true;
int v = S.top();
S.pop();
ans[total++] = v;
for(int i=0;i<G[v].size();i++) {
inDe[G[v][i]]--;
if(!inDe[G[v][i]]) {
S.push(G[v][i]);
}
}
}
if(total == n && !f) {
printf("Sorted sequence determined after %d relations: ",k+1);
for(int i=n-1;i>=0;i--)
printf("%c",ans[i]+'A');
puts(".");
return true;
}
else if(total < n){
printf("Inconsistency found after %d relations.\n",k+1);
return true;
}
else
return false;
}
int main()
{
while(cin >> n >> m) {
if(!n && !m)
break;
bool flag = false;
init();
for(int i=0;i<m;i++) {
char a, b, c;
cin >> a >> c >> b;
if(flag)
continue;
inDegree[a-'A']++;
G[b-'A'].push_back(a-'A');
if(topSort(i)) {
flag = true;
}
}
if(!flag) {
printf("Sorted sequence cannot be determined.\n");
}
}
}