poj 图相关之1094Sorting It All Out
来源:互联网 发布:js onscroll 编辑:程序博客网 时间:2024/06/09 10:47
poj 图相关之1094Sorting It All Out
Accepted 144K 0MS
测试数据http://poj.org/showmessage?message_id=133905
我个人觉得这道题有很大的bug,最开始我的代码是这样的,测试数据的第六个显示的是
Inconsistency found after 26 relations.
因为在前25个确实能够排好序,但是第26的时候就出现了Inconsistency(我的check函数就是用作这个的),但是其实这道题其实这要排好序了就用管后面的数据是否Inconsistency了,所以根据题意第6组数据的结果显示为:
Sorted sequence determined after 25 relations: ABCDEFGHIJKLMNOPQRSTUVWXYZ.
ac的版本:
#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<math.h>#include<algorithm>#include<memory.h>#include<vector>#include<queue>#include<map>using namespace std;int n, m, degree[26];vector<int> vec[26];vector<int> result;bool mark[26], vis[26];int TopSort(int tmp){ int i, j, k, count, idx, tmpdegree[26], flag; result.clear(); memset(vis, 0, sizeof(vis)); for (i = 0; i < 26; i++) tmpdegree[i] = degree[i]; flag = 1; for (i = 0; i < tmp; i++) { count = 0; idx = -1; for (j = 0; j < 26; j++) { if (!tmpdegree[j] && mark[j] && !vis[j]) { count++; idx = j; } } if (!count) { return 0; } else { if (count > 1) flag = 2; result.push_back(idx); vis[idx] = 1; for (k = 0; k < vec[idx].size(); k++) { tmpdegree[vec[idx][k]]--; } } } if (flag == 2) return 2; else return 1;}int main(){ //freopen("1.txt", "r", stdin); int i, j, t, Cases, tm, it; bool flag; char tmp[20]; while (scanf("%d%d", &n, &m) != EOF && (n || m)) { for (i = 0; i < 26; i++) vec[i].clear(); memset(mark, 0, sizeof(mark)); memset(degree, 0, sizeof(degree)); tm = 0; t = 2; for (i = 0; i < m; i++) { scanf("%s", tmp); vec[tmp[0] - 'A'].push_back(tmp[2] - 'A'); if (!mark[tmp[0] - 'A']) { mark[tmp[0] - 'A'] = 1; tm++; } if (!mark[tmp[2] - 'A']) { mark[tmp[2] - 'A'] = 1; tm++; } degree[tmp[2] - 'A']++; t = TopSort(tm); //t为0表示有环 为1表示有唯一排序 为2表示没有唯一排序 if (t == 0) break; if (t == 1 && result.size() == n) { flag = 1; for (j = i+1; j < m; j++) { scanf("%s", tmp); } printf("Sorted sequence determined after %d relations: ", i + 1); for (j = 0; j < result.size(); j++) printf("%c", char(result[j] + 'A')); printf(".\n"); break; } } if (t == 0) { for (j = i+1; j < m; j++) scanf("%s", tmp); printf("Inconsistency found after %d relations.\n", i + 1); } else if (t == 2) { printf("Sorted sequence cannot be determined.\n"); } else if (t == 1 && result.size() != n) { printf("Sorted sequence cannot be determined.\n"); } }}
个人觉得对的版本:
#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<math.h>#include<algorithm>#include<memory.h>#include<vector>#include<queue>#include<map>using namespace std;int n, m, degree[26];vector<int> vec[26];vector<int> result;bool mark[26], vis[26];int TopSort(int tmp){ int i, j, k, count, idx, tmpdegree[26], flag; result.clear(); memset(vis, 0, sizeof(vis)); for (i = 0; i < 26; i++) tmpdegree[i] = degree[i]; flag = 1; for (i = 0; i < tmp; i++) { count = 0; idx = -1; for (j = 0; j < 26; j++) { if (!tmpdegree[j] && mark[j] && !vis[j]) { count++; idx = j; } } if (!count) { return 0; } else { if (count > 1) flag = 2; result.push_back(idx); vis[idx] = 1; for (k = 0; k < vec[idx].size(); k++) { tmpdegree[vec[idx][k]]--; } } } if (flag == 2) return 2; else return 1;}bool check(char*tmp){ char a, b; int i, j, t; i = j = -1; for (t = 0; t < result.size(); t++) { if (tmp[0] - 'A' == result[t]) i = t; if (tmp[2] - 'A' == result[t]) j = t; } if (i == -1 || j == -1 || i < j) return true; return false;}int main(){ //freopen("1.txt", "r", stdin); int i, j, t, Cases, tm, it; bool flag; char tmp[20]; while (scanf("%d%d", &n, &m) != EOF && (n || m)) { for (i = 0; i < 26; i++) vec[i].clear(); memset(mark, 0, sizeof(mark)); memset(degree, 0, sizeof(degree)); tm = 0; t = 2; for (i = 0; i < m; i++) { scanf("%s", tmp); vec[tmp[0] - 'A'].push_back(tmp[2] - 'A'); if (!mark[tmp[0] - 'A']) { mark[tmp[0] - 'A'] = 1; tm++; } if (!mark[tmp[2] - 'A']) { mark[tmp[2] - 'A'] = 1; tm++; } degree[tmp[2] - 'A']++; t = TopSort(tm); //t为0表示有环 为1表示有唯一排序 为2表示没有唯一排序 if (t == 0) break; if (t == 1 && result.size() == n) { flag = 1; for (j = i+1; j < m; j++) { scanf("%s", tmp); if (flag) { if (!check(tmp)) { flag = 0; it = j; } } } if (!flag) { printf("Inconsistency found after %d relations.\n", it + 1); } else { printf("Sorted sequence determined after %d relations: ", i + 1); for (j = 0; j < result.size(); j++) printf("%c", char(result[j] + 'A')); printf(".\n"); } break; } } if (t == 0) { for (j = i+1; j < m; j++) scanf("%s", tmp); printf("Inconsistency found after %d relations.\n", i + 1); } else if (t == 2) { printf("Sorted sequence cannot be determined.\n"); } else if (t == 1 && result.size() != n) { printf("Sorted sequence cannot be determined.\n"); } }}
阅读全文
0 0
- poj 图相关之1094Sorting It All Out
- poj 1094 Sorting It All Out
- poj 1094 Sorting It All Out
- poj 1094 Sorting It All Out
- [POJ] 1094 Sorting It All Out
- POJ-1094 Sorting It All Out
- POJ-1094-Sorting It All Out
- POJ 1094 Sorting It All Out
- POJ 1094 Sorting It All Out
- POJ 1094 Sorting It All Out
- poj-1094-Sorting It All Out
- POJ 1094 Sorting It All Out
- poj 1094 Sorting It All Out
- POJ 1094 Sorting It All Out
- POJ-1094-Sorting It All Out
- poj 1094 Sorting It All Out
- poj 1094 Sorting It All Out(图论)
- poj 1094 Sorting It All Out
- 关于JS中的数据类型
- java数字签名
- CodeChef MOU2H
- c语句
- JSP中获取用户IP的两种方式
- poj 图相关之1094Sorting It All Out
- mybatis源码分析-注解-1
- Android学习资料收集
- 史上最详细:在VMware虚拟机里搭建DB2 purescale测试
- 伪造链接地址的二种方法
- 走入javascript(七) 函数 不定参 参数和return
- Python基础-操作文件和目录
- CentOS7关闭/开启防火墙出现Unit iptables.service failed to load: No such file or directory
- 威威猫系列故事——打地鼠