首页 > 代码库 > POJ1094 拓扑排序
POJ1094 拓扑排序
问题:POJ1094
本题考查拓扑排序算法
拓扑排序:
1)找到入度为0的点,加入已排序列表末尾;
2)删除该点,更新入度数组。
循环1)2)直到
1. 所有点都被删除,则找到一个拓扑排序;
2. 或剩余结点中没有入度为0的点,则原图中必存在环。
本题算法
1.依次输入一组关系
对当前关系进行拓扑排序
1)若存在环,则无法排序
2)若根据当前关系,每次循环都唯一的确定入度为0的点,则存在排序
2.若输完所有的大小关系之后,仍然没有确定大小排序,也没有发现回环,则排序无法唯一确定
AC代码:
1 //Memory: 224K Time: 0MS 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <string> 6 7 using namespace std; 8 9 const int maxn = 26;10 bool g[maxn][maxn];11 int indegree[maxn];12 int in[maxn];13 int vis[maxn];14 int flag;15 int n, m;16 int out[maxn];17 string s;18 int size;19 int ans;20 21 int topologicalSort()22 {23 memset(vis, 0, sizeof(vis));24 memcpy(in, indegree, sizeof(in));25 size = 0;26 flag = 0;27 while (size < n){28 int num = 0;29 int next;30 for (int i = 0; i < n; i++){31 if (vis[i]) continue;32 if (in[i] == 0) {33 num++;34 if (num > 1) break;35 next = i;36 }37 }38 if (num == 0) return 0;39 else {40 out[size++] = next;41 vis[next] = 1;42 for (int i = 0; i < n; i++) {43 if ( g[next][i] && !vis[i] )44 in[i]--;45 }46 if (num > 1)47 flag = 1;48 }49 }50 if (flag == 0) return 1;51 else return 2;52 }53 54 int main()55 {56 while (cin >> n >> m && n) {57 memset(g, 0, sizeof(g));58 memset(indegree, 0, sizeof(indegree));59 ans = 2;60 for (int i = 0; i < m; i++){61 cin >> s;62 if ( ans != 2 ) continue;63 if (!g[s[0] - ‘A‘][s[2] - ‘A‘]) {64 g[s[0] - ‘A‘][s[2] - ‘A‘] = 1;65 indegree[s[2] - ‘A‘]++;66 ans = topologicalSort();67 68 if (ans == 0) {69 cout << "Inconsistency found after " << i + 1 <<" relations." << endl;70 }71 else if ( ans == 1 ){72 cout << "Sorted sequence determined after " << i + 1 << " relations: ";73 for (int i = 0; i < n; i++)74 cout << (char)(out[i] + ‘A‘);75 cout << "." << endl;76 }77 }78 }79 80 if ( ans == 2 )81 cout << "Sorted sequence cannot be determined." << endl;82 }83 return 0;84 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。