uva10304 Ordering-Tasks 拓扑排序
来源:互联网 发布:centos 7.0安装教程 编辑:程序博客网 时间:2024/06/08 03:00
拓扑排序的邻接表和矩阵实现
利用二维数组稀疏表很浪费空间,利用邻接表更好。
利用邻接表要堤防重复值。
例如:1,3 1,3 二维数组把一个结点赋1,但是邻接表在一个节点下会出现两个值。
设置visited数组之后一般不用担心邻接表重复值影响结果。
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19451
//二维数组实现#include<cstdio>#include<iostream>#include<sstream>#include<cstdlib>#include<cmath>#include<cctype>#include<string>#include<cstring>#include<algorithm>#include<stack>#include<queue>#include<set>#include<map>#include<ctime>#include<vector>#include<fstream>using namespace std;int G[101][101];stack<int>topo;int visited[105];int n,m;bool dfs(int v){ visited[v] = -1; for(int i = 1; i <= n; ++i) { if(G[v][i]) { if(visited[i] < 0) return false; else if(!visited[i] && !dfs(i)) return false; } } visited[v] = 1; topo.push(v); return true;}bool topoSort(){ for(int i = 1; i <= n; ++i) { if(!visited[i]) if(!dfs(i)) return false; } return true;}int main(){ //freopen("F:\\data.txt","r",stdin); int a,b; while(scanf("%d%d",&n,&m) != EOF) { if(n == 0 && m == 0) break; memset(G,0,sizeof(G)); memset(visited,0,sizeof(visited)); for(int i = 0; i < m; ++i) { scanf("%d%d",&a,&b); G[a][b] = 1; } topoSort();//利用返回值可以检测是否有回路 printf("%d",topo.top());//利用栈来输出 topo.pop(); for(int i = 1; i < n; ++i) { printf(" %d",topo.top()); topo.pop(); } printf("\n"); } return 0;}//vector<vector<int> >G实现;#include<cstdio>#include<iostream>#include<sstream>#include<cstdlib>#include<cmath>#include<cctype>#include<string>#include<cstring>#include<algorithm>#include<stack>#include<queue>#include<set>#include<map>#include<ctime>#include<vector>#include<fstream>using namespace std;vector<vector<int> >G;stack<int>topo;int visited[105];bool dfs(int n){ int t; visited[n] = -1; int l = G[n].size(); for(int i = 0; i < l; ++i) { t = G[n][i]; if(visited[t] == -1) return false; else if(!visited[t] && !dfs(t)) return false; } visited[n] = 1; topo.push(n); return true;}bool topoSort(int n){ for(int i = 1; i <= n; ++i) { if(!visited[i]) if(!dfs(i)) return false; } return true;}int main(){ //freopen("F:\\data.txt","r",stdin); int n,m; int a,b; while(scanf("%d%d",&n,&m) != EOF) { if(n == 0 && m == 0) break; G.resize(n+5); G.clear(); memset(visited,0,sizeof(visited)); for(int i = 0; i < m; ++i) { scanf("%d%d",&a,&b); G[a].push_back(b); } topoSort(n);//可以通过返回值判断是否有回路 printf("%d",topo.top()); topo.pop(); for(int i = 1; i < n; ++i) { printf(" %d",topo.top()); topo.pop(); } printf("\n"); } return 0;}
0 0
- uva10304 Ordering-Tasks 拓扑排序
- Ordering Tasks (拓扑排序)
- Ordering Tasks(拓扑排序)
- 10305 - Ordering Tasks(****)拓扑排序
- 10305 - Ordering Tasks//拓扑排序
- Ordering Tasks(拓扑排序)
- UVA10305 Ordering Tasks 拓扑排序
- sicily Ordering Tasks 拓扑排序
- Uva10305 Ordering Tasks(拓扑排序)
- UVA10305 Ordering Tasks(拓扑排序)
- uva 10305 Ordering Tasks(拓扑排序)
- uva 10305 Ordering Tasks (拓扑排序)
- UVa 10305 Ordering Tasks (拓扑排序模板)
- [UVA 10305] Ordering Tasks (拓扑排序)
- UVa 10305 - Ordering Tasks 拓扑排序
- UVa 10305 Ordering Tasks(拓扑排序)
- UVa 10305 - Ordering Tasks 拓扑排序题解
- (拓扑排序) uva Ordering Tasks
- 传统线程互斥技术(传统的sychronized)
- [LeetCode]--295. Find Median from Data Stream
- [Xcode]打包错误 -ERROR ITMS 记录
- uva10375 选择与除法 唯一分解定理
- WebRTC学习笔记
- uva10304 Ordering-Tasks 拓扑排序
- 51Nod-1489-蜥蜴和地下室
- SparkMLlib---SGD随机梯度下降算法
- 用递归方式实现二叉树先序、中序、后序遍历
- Volley 的基本使用
- 文章标题
- Android Studio引用第三方jar包及开源library的方法
- 多线程编程入门(16):线程同步工具之CyclicBarrier
- uva10129 欧拉回路 判断出入度数 连通性 遍历压栈