问题:POJ1094
本题考查拓扑排序算法
拓扑排序:
1)找到入度为0的点,加入已排序列表末尾;
2)删除该点,更新入度数组。
循环1)2)直到
1. 所有点都被删除,则找到一个拓扑排序;
2. 或剩余结点中没有入度为0的点,则原图中必存在环。
本题算法
1.依次输入一组关系
对当前关系进行拓扑排序
1)若存在环,则无法排序
2)若根据当前关系,每次循环都唯一的确定入度为0的点,则存在排序
2.若输完所有的大小关系之后,仍然没有确定大小排序,也没有发现回环,则排序无法唯一确定
AC代码:
//Memory: 224K Time: 0MS #include <iostream> #include <cstdio> #include <cstring> #include <string> using namespace std; ; bool g[maxn][maxn]; int indegree[maxn]; int in[maxn]; int vis[maxn]; int flag; int n, m; int out[maxn]; string s; int size; int ans; int topologicalSort() { memset(vis, , sizeof(vis)); memcpy(in, indegree, sizeof(in)); size = ; flag = ; while (size < n){ ; int next; ; i < n; i++){ if (vis[i]) continue; ) { num++; ) break; next = i; } } ) ; else { out[size++] = next; vis[next] = ; ; i < n; i++) { if ( g[next][i] && !vis[i] ) in[i]--; } ) flag = ; } } ) ; ; } int main() { while (cin >> n >> m && n) { memset(g, , sizeof(g)); memset(indegree, , sizeof(indegree)); ans = ; ; i < m; i++){ cin >> s; ) continue; ] - ] - 'A']) { g[s[] - ] - ; indegree[s[] - 'A']++; ans = topologicalSort(); ) { cout << <<" relations." << endl; } ){ cout << << " relations: "; ; i < n; i++) cout << (char)(out[i] + 'A'); cout << "." << endl; } } } ) cout << "Sorted sequence cannot be determined." << endl; } ; }