拓扑排序模板
来源:互联网 发布:淘宝地址在哪里添加 编辑:程序博客网 时间:2024/05/21 15:47
两种类型依情况使用,多数使用第二种dfs
#include <iostream> using namespace std; int map[502][502], indegree[502], m, n, pur[502]; void topsort() { int i, j, k=1; for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { if(indegree[j]==0) { indegree[j]--; pur[k++] = j; for(int x=1; x<=n; x++) if(map[j][x]) indegree[x]--; break; } } if(j>n) { cout<<"存在环"<<endl; return ; } } } void main() { int i, j; while(cin>>n>>m) { memset(map,0,sizeof(map)); memset(indegree,0,sizeof(indegree)); int a, b; for(i=1; i<=m; i++) { cin>>a>>b; if(!map[a][b]) { map[a][b] = 1; indegree[b]++; } } topsort(); for(i=1; i<=n; i++) if(i!=n) cout<<pur[i]<<" "; else cout<<pur[i]<<endl; } }
vector<int>g[N];//邻接表存储int vis[N],topo[N],cnt;bool dfs(int u){ vis[u] = -1;//-1用来表示顶点u正在访问 for(int i = 0 ; i < g[u].size() ; i ++) { if(vis[g[u][i]] == -1)//表示这个点进入了两次,肯定出现了环 return false; else if(vis[g[u][i]] == 0) { dfs(g[u][i]); } } vis[u] = 1; topo[cnt++] = u;//放到结果数组里,输出的时候记得倒序输出,(回溯的原因) return true;}bool toposort(int n){ memset(vis,0,sizeof(vis)); for(int i = 1 ; i <= n ; i ++) { if(!vis[i]) { if(!dfs(i)) return false;//huan } } return true;}
0 0
- 拓扑排序的模板
- 拓扑排序及模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序-模板
- 拓扑排序toposort 模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序算法模板
- 拓扑排序【模板】
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 学习笔记 -- 斯坦福课程:CNN for Visual Recognition(一)
- Android ListView的通用适配器Adapter
- 程序的执行过程
- ImportDLL的用法(win32 API )
- HDOJ 1757 A Simple Math Problem (矩阵快速幂)
- 拓扑排序模板
- 使用ImageLoader进行图片加载
- Android执行文件apk的组成结构
- MySQL库表视图索引操作
- HTML5 WebSocket简介
- Git使用sublime_text作用默认编辑器
- Qt之QSS使用
- 视频去雾效果
- 我所做过的项目总结