uva10305
来源:互联网 发布:2016京东618销售数据 编辑:程序博客网 时间:2024/05/16 05:54
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19494
下面给出刘汝佳的代码,但是个人觉得分成两个方法有点繁琐,后面又附上个人自己写的代码
//尽量用if条件中不要包含if(flag[i] == 1)这样的语句;最好改为 if(flag[i])#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1000 + 5;int g[maxn][maxn]; //g[i][j] = 1 代表i任务要优先j任务完成int flag[maxn]; //1代表已经访问过了,-1代表正在访问,0代表未访问int ans[maxn]; //保存答案int m, n, t; //m表示关系数量,n代表有多少个任务bool dfs(int u) { flag[u] = -1; for(int v = 0; v < n; v++) { if(g[u][v]) { if(flag[v] < 0) return false; else if(!flag[v]) dfs(v); } } flag[u] = 1; ans[--t] = u; //注意因为dfs是递归实现的,所以遍历访问完一个节点后必须把它放在拓补序列的首部 return true;}bool topoSort() { t = n; for(int i = 0; i < n; i++) { if(!flag[i]) if(!dfs(i)) return false; } return true;}int main(){ while(scanf("%d%d", &n, &m) == 2 && n ) { memset(g, 0, sizeof(g)); for(int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); a--; b--; g[a][b] = 1; //因为题意是从1开始的节点,所以存储进去的时候必须减一 } memset(flag, 0, sizeof(flag)); if(topoSort()) { //在拓补排序过程中将答案压入ans中 for(int i = 0; i < n - 1; i++) printf("%d ", ans[i] + 1); printf("%d\n", ans[n-1] + 1); } else printf("No\n"); } return 0;}
自己写的代码如下:
#include <iostream>#include <cstdio>#include <vector>#include <queue>#include <cstring>using namespace std;const int maxn = 1000 + 5;int n, m, G[maxn][maxn], inDgree[maxn];vector<int> ans;bool topoSort() { queue<int> q; int cnt = 0; for(int i = 1; i <= n; i++) if(inDgree[i] == 0) q.push(i); while(!q.empty()) { int u = q.front(); q.pop(); ans.push_back(u); cnt++; for(int i = 1; i <= n; i++) if(G[u][i]) { G[u][i] = 0; //消除临接的边 if(--inDgree[i] == 0) q.push(i); //如果有入度为0的点,就加入队列 } } if(cnt != n) return false; else return true;}int main(){ while(scanf("%d%d", &n, &m) && n) { memset(G, 0, sizeof(G)); memset(inDgree, 0, sizeof(inDgree)); int u, v; for(int i = 0; i < m; i++) { //创建临接矩阵 cin >> u >> v; G[u][v] = 1; inDgree[v]++; } ans.clear(); if(topoSort()) { printf("%d", ans[0]); for(int i = 1; i < ans.size(); i++) printf(" %d", ans[i]); printf("\n"); } else printf("No\n"); } return 0;}
0 0
- UVA10305
- UVA10305
- uva10305
- uva10305
- uva10305(拓扑
- uva10305--拓扑
- UVa10305拓扑排序
- UVA10305- Ordering Tasks
- uva10305 Ordering Tasks
- UVa10305 Ordering Tasks
- Ordering Tasks UVA10305
- UVa10305 Ordering Tasks
- UVa10305 - Ordering Tasks
- 拓扑排序 uva10305
- UVA10305 - Ordering Tasks
- UVA10305拓扑排序
- UVA10305 欢迎LFX学弟
- uva10305 拓扑排序
- androidStudio异常:Couldn't load memtrack module (No such file or directory)
- JNI调用Java方法的流程
- SQL Server Data Tools 2013中保存包save copy of
- 关于c#除法运算的问题
- MacBook笔记本用户与群组中无视警告修改高级选项引起进入root用户模式的混乱
- uva10305
- LA 4255 Guess 拓扑排序
- NKOI 1023 生命游戏
- 1001:Exponentiation
- log4j配置
- ggplot2-设置坐标轴
- KMP算法简单分析
- ## stm32库函数初探 ##
- 高斯消元的学习