拓扑排序
sort it all out
sorting it all out
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#define Max 50
#define Maxm 1000
using namespace std;
int indegree[Max];
struct edge {
int u, v, next;
}edges[Maxm];
int head[Max], total, visited[Max];
void addedge(int u, int v) {
edges[total].u = u;
edges[total].v = v;
edges[total].next = head[u];
head[u] = total++;
}
int todosort(int n, int m) {
memset(visited, 0, sizeof(visited));
int total = 0;
queue<int> que;
vector<int> res;
bool not_deter = false;
int temp_degree[Max];
for(int i=0; i<n; i++) {
temp_degree[i] = indegree[i];
}
for(int i=0; i<n; i++) {
if(temp_degree[i] == 0) {
que.push(i);
}
}
while(!que.empty()) {
int u = que.front();
que.pop();
if(que.size()>0) not_deter = true;
total++;
visited[u] = 1;
res.push_back(u);
for(int i=head[u]; i!=-1; i=edges[i].next) {
int v = edges[i].v;
if(visited[v] == 0) temp_degree[v]--;
if(temp_degree[v] == 0) {
que.push(v);
}
}
}
if(total < n) return -1;
if(not_deter == false) {
printf("Sorted sequence determined after %d relations: ", m);
for(int i=0; i<n; i++) {
printf("%c", res[i]+'A');
}
cout<<"."<<endl;
return 1;
}
return 0;
}
int main(int argc, const char * argv[]) {
int n, m, flag;
while(scanf("%d%d", &n, &m) && n!=0 && m!=0) {
memset(head, -1, sizeof(head));
memset(indegree, 0, sizeof(indegree));
total = 0;
flag = 0;
getchar();
for(int k=0; k<m; k++) {
string str;
getline(cin, str);
if(flag == 1 || flag == -1) continue;
int u = str[0]-'A';
int v = str[2]-'A';
if(u == v) continue;
indegree[v]++;
addedge(u, v);
for(int i=head[v]; i!=-1; i=edges[i].next) {
if(u == edges[i].v) {flag = -1; break;}
}
if(flag != -1) {
flag = todosort(n, k+1);
}
if(flag == -1) {
printf("Inconsistency found after %d relations.\n", k+1);
}
}
if(flag == 0) printf("Sorted sequence cannot be determined.\n");
}
return 0;
}