博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdoj1285 拓扑排序
阅读量:6075 次
发布时间:2019-06-20

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

分析: 

很明显,一看就是拓扑排序。 看似简单, 暗藏武器啊。 第一次做的时候一边拓扑排序一边标记他们的深度, 例如题中给的例子 {1 2;2 3;4 3 }。1的深度为1。 2、4的深度为2; 3的深度为3。 然后按深度的逆序输出深度相同的先输出小的。 其实不然啊!! 举个例子6个点, 边为{5, 3; 5,1; 5,4; 5,2; 3,1; 3,2; 6,4; 6,2; 4,2} 最好自己画一下, 看的更明白些!! 按我第一次思路 从1到6他们深度依次为1,1,2,2,3,3; 结果为5, 6,3, 4, 1, 2。 其实哩。正确结果应该为5, 3, 1, 6, 2, 4。 
最初没有比5、6大的数, 5〈 6,所以输出5。 这时相当于没有5了, 去掉5之后发现, 也没有比3大的数了, 3又小于6, 所以先输出3。 取掉3, 这时也没有比1大的数了, 在输出1………….直到输出所有点。 

正确解题思路为: 
1)选一个入度为0的点p输出; 
2)从图中删除p点 
3)将p全部后继点的入度-1 
4)重复1-3,直到全部点都输出

 

#include
#include
#include
#include
#include
using namespace std;int n, m, mx, v[505], e[505][505], ru[505];void topu(){ int sum = 0; int flag = 1; while(sum < n) { for(int i = 1; i <= n; i++) { if(v[i] == 0 && ru[i] == 0) { v[i] = 1; if(flag == 1) {printf("%d", i);flag = 0;} else printf(" %d", i); for(int j = 1; j <= n; j++) { if(e[i][j] == 1) { ru[j]--; e[i][j] = 0; } } sum++; break; } } }}int main(){ while(scanf("%d%d", &n, &m) != EOF) { memset(e, 0, sizeof(e)); memset(v, 0, sizeof(v)); memset(ru, 0, sizeof(ru)); for(int i = 1; i <= m; i++) { int x, y; scanf("%d%d", &x, &y); if(e[x][y] == 0) { e[x][y] = 1; ru[y]++; } } topu(); cout << endl; } return 0;}
View Code

 

转载于:https://www.cnblogs.com/wd-one/p/4520714.html

你可能感兴趣的文章
SQL语句常见优化十大案例
查看>>
生产环境之“进程”两字
查看>>
《跟菜鸟学Cisco UC部署实战》-视频课程-上线(已期待1年有余)
查看>>
踏青赏花正当时-北京大觉寺游记图
查看>>
那年在深圳找工作的日子
查看>>
移动支付“钱景”无限,Square估值40亿美刀
查看>>
京东苏宁大战的背后
查看>>
微商怎么引流客源,谈谈我这些年引流的经验
查看>>
运算符==和Equals()的总结
查看>>
艾伟:Silverlight 2应用程序中XAP文件揭秘
查看>>
Asio学习1: TCP客户端:对准时间 解析
查看>>
jQuery之万能的选择器
查看>>
(android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图
查看>>
了解电子邮件加密 保证隐私内容安全
查看>>
史上最恶毒10大病毒 Conficker排名第八
查看>>
Win7 配“.NET研究”置Android开发环境
查看>>
【Perl】模块 Tie::File
查看>>
NHibernate初学者指南(2):一个完整的例子
查看>>
Jenkins最佳实践
查看>>
SQL Server 2005 性能优化实战系列(文章索引)
查看>>