poj-1094 Sorting It All Out
2016-01-26 19:19
344 查看
题意:给定一组大小关系,判断是否能够确定有唯一的拓扑序列。
输出格式有三种:1. 有唯一的拓扑序列,依次输出。
2. 该序列不能判断是否有序。
3. 出现矛盾,即出现环。
输出格式的判断也有一定的先后顺序:先判断3 然后判断1 最后是2。 判断2时要遍历完整个图才能下结论。 而对于1,3一旦出现结果就可以输出,接下来的输入就可以忽略。
每组输入进行一次拓扑排序。
输出格式有三种:1. 有唯一的拓扑序列,依次输出。
2. 该序列不能判断是否有序。
3. 出现矛盾,即出现环。
输出格式的判断也有一定的先后顺序:先判断3 然后判断1 最后是2。 判断2时要遍历完整个图才能下结论。 而对于1,3一旦出现结果就可以输出,接下来的输入就可以忽略。
每组输入进行一次拓扑排序。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <stack> using namespace std; int indegree[30]; int Mp[30][30];//i--->j int ans[30]; int index; //拓扑排序 int TopoSort(int n) { stack<int> sta; int flag=1; int tem[30]; for (int i = 1; i <= n; i++) tem[i] = indegree[i];//避免对indgree数组产生影响 index = 0; for (int i = 1; i <= n; i++) if (tem[i] == 0) sta.push(i); while (!sta.empty()) { if (sta.size() > 1) flag=0;//序列不确定。不能直接return ,后面可能还有环出现 int cnt = sta.top(); sta.pop(); ans[index++] = cnt; for (int i = 1; i <= n;i++) if (Mp[cnt][i]) { if (--tem[i]==0) sta.push(i); } } if (index != n) return -1;//有环 if (flag == 0) return 0;//不确定 else return 1;//唯一确定 } int main() { int n, m; while (scanf("%d%d", &n, &m) != EOF) { if (n == 0 && m == 0) break; bool isok = false;//是否已经产生结果 char str[10]; memset(indegree, 0, sizeof indegree); memset(Mp, 0, sizeof Mp); for (int i = 1; i <= m; i++) { scanf("%s", str); int u = str[0] - 'A' + 1; int v = str[2] - 'A' + 1; Mp[u][v] = 1; indegree[v]++; if (isok) continue;// int flag = TopoSort(n); if (flag == 1) { //OK isok = true; printf("Sorted sequence determined after %d relations: ", i); for (int j = 0; j < n; j++) { printf("%c", ans[j] - 1 + 'A'); } printf(".\n"); } else if (flag == -1) { //circle printf("Inconsistency found after %d relations.\n", i); isok = true; } } if (isok == false) { //uncertain printf("Sorted sequence cannot be determined.\n"); } } return 0; }
相关文章推荐
- 字符串匹配算法-KMP详解
- ?12星座综合实力排行,第一名居然是他……
- 网络攻击
- MR-4.MapReduce压缩基本介绍
- 2016.1.26寒假训练赛1
- 弧度 和 角度的理解, 以及相互转换
- 一个仅供测试的百度地图的AK
- 瞎玩第三节 一直能提示 move the box
- jsp中文乱码的一些小心得
- 数组常用方法
- 微软,步子迈大了扯的蛋疼
- 别名推送
- 如何用powershell在windowsazure上建立DS系列虚机
- GameMode vs GameState
- hdu1556题解
- 友盟自定义意见反馈Demo
- 在一个终端踢掉另一个终端的用户
- AfxEnableControlContainer()
- 转载:ffmpeg 音视频合成分割
- liunx设置时区