博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 10305 Ordering Tasks (例题 6-15)
阅读量:5978 次
发布时间:2019-06-20

本文共 2512 字,大约阅读时间需要 8 分钟。

传送门: 

 

拓扑排序(topological sort)简单题

 

自己代码的思路来自: ==> 

感谢n久前蔡大神扔给我这个链接2333333

 

1 #include 
2 using namespace std; 3 4 const int MAXN = 111; 5 bool vis[MAXN]; 6 int G[MAXN][MAXN]; 7 int indegree[MAXN]; 8 int main(){ 9 int n, m;10 while(cin >> n >> m){11 if(n == 0 && m == 0) break;12 memset(vis, false, sizeof(vis));13 memset(G, 0, sizeof(G));14 memset(indegree, 0, sizeof(indegree));15 for(int i = 0; i < m; ++i){16 int a, b;17 cin >> a >> b;18 G[a][b] = 1;19 indegree[b] += 1;20 }21 queue
q;22 while(!q.empty()) q.pop();23 for(int i = 1; i <= n; ++i)24 if(!indegree[i]) q.push(i);25 int total = n;26 while(!q.empty()){27 int cur = q.front();28 q.pop();29 cout << cur;30 if(--total) cout << " ";31 vis[cur] = true;32 for(int i = 1; i <= n; ++i){33 if(G[cur][i]){34 --indegree[i];35 if(!indegree[i] && !vis[i])36 q.push(i);37 }38 }39 }40 cout << endl;41 }42 return 0;43 }

 

入门经典的思路:

1 #include 
2 using namespace std; 3 4 const int MAXN = 111; 5 int n, m, t; 6 int vis[MAXN]; 7 int topo[MAXN]; 8 int G[MAXN][MAXN]; 9 10 bool dfs(int cur){11 //vis数组存储三个状态{-1, 0, 1}12 //-1 代表该点正在访问中(正在栈帧中)13 // 0 代表该点没有被访问过14 // 1 代表该点及所有有关系的点都被访问过了15 vis[cur] = -1;16 for(int i = 1; i <= n; ++i)17 if(G[cur][i]){18 //若在访问中遇到符合要求且正在调用的点,证明图存在有向环,不存在拓扑排序19 if(vis[i] < 0) return false; 20 else if(!vis[i] && !dfs(i)) return false;21 }22 vis[cur] = 1;23 topo[--t] = cur;24 return true;25 }26 bool toposort(){27 t = n;28 memset(vis, 0, sizeof(vis));29 memset(topo, 0, sizeof(topo));30 for(int i = 1; i <= n; ++i)31 if(!vis[i])32 if(!dfs(i))33 return false;34 return true;35 }36 int main(){37 while(cin >> n >> m){38 if(n == 0 && m == 0) break;39 memset(G, 0, sizeof(G));40 while(m--){41 int a, b;42 cin >> a >> b;43 G[a][b] = 1;44 }45 if(toposort())46 for(int i = 0; i < n; ++i) cout << topo[i] << " \n"[i == n-1];47 }48 return 0;49 }

 

转载于:https://www.cnblogs.com/book-book/p/5336356.html

你可能感兴趣的文章
MySQL · 引擎特性 · InnoDB COUNT(*) 优化(?)
查看>>
Guice系列之用户指南(十)
查看>>
树与森林的存储、遍历和树与森林的转换
查看>>
mongodb的读写分离
查看>>
Android自定义属性
查看>>
Visual C#之核心语言
查看>>
代码重构(五):继承关系重构规则
查看>>
Windows App开发之集合控件与数据绑定
查看>>
五分钟创建一个自己的NPM包
查看>>
中大型网站技术架构演变过程
查看>>
ARTS训练第三周
查看>>
vue中v-for循环如何将变量带入class的属性名中
查看>>
php excel
查看>>
一些设计思想的汇集(2)
查看>>
GRUB and LVM and EVMS
查看>>
List集合的迭代器方法
查看>>
ECShop替换FCKeditor编辑器为KindEditor
查看>>
面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化...
查看>>
OSI七层模型和TCP/IP四层模型
查看>>
ceph学习笔记之七 数据平衡
查看>>