拓扑排序
2016-07-23 09:35
197 查看
对一个有向无环图a进行拓扑排序,是将a中所有顶点排成线性序列,使得图中任意一对顶点x和y,若边(x,y)属于E(a),则x在线性序列中出现在y之前。
如:给定图的信息:
一种可能的拓扑排序:2 8 0 3 7 1 5 6 4 9 10 11 12
解法:从有向图中选择一个入度为0的顶点并且输出它;从图中删去该顶点,并且删去从该顶点发出的全部有向边,重复上述两部,直到剩余的顶点中不存在没有前驱的顶点为止。
如:给定图的信息:
一种可能的拓扑排序:2 8 0 3 7 1 5 6 4 9 10 11 12
解法:从有向图中选择一个入度为0的顶点并且输出它;从图中删去该顶点,并且删去从该顶点发出的全部有向边,重复上述两部,直到剩余的顶点中不存在没有前驱的顶点为止。
#include<bits/stdc++.h> using namespace std; int a[1000][1000]; int main() { int n,m; while(scanf("%d %d",&n,&m)!=EOF) { int du[1000],b[1000],x,y,z; memset(a,-1,sizeof(a)); memset(du,0,sizeof(du)); for(int i=0;i<m;i++) { scanf("%d %d %d",&x,&y,&z); a[x][y]=z; du[y]++; } queue<int>pq; int cnt=0; for(int i=0;i<=n;i++) { if(du[i]==0) pq.push(i); } while(!pq.empty()) { int cur=pq.front(); pq.pop(); b[cnt++]=cur; for(int i=0;i<=n;i++) if(a[cur][i]!=-1) { du[i]--; if(du[i]==0) pq.push(i); } } for(int i=0;i<=n;i++) printf("%d ",b[i]); printf("\n"); } return 0; }
相关文章推荐
- 图形验证码的生成
- 安卓属性动画之插值器(TimeInterpolator)和估值器(TypeEvaluator)
- alter table <修改表>
- 写给自己的文章~前端开发实习总结
- javascript中confirm(确认),alert(警告),prompt(提问)的用法及其示例
- POJ1789 Truck History
- linux常用tar命令举例说明(新手可快速掌握)。
- hibernate 一对多查询对set的排序
- URAL 1970 J - 皇后像廣場 dfs
- 微信支付错误两个问题的解决:curl出错,错误码:60
- 侧边栏的动画效果
- Android常用5大布局
- springmvc上传文件
- linux - 对于双系统的用户来说,在磁盘分区变化之后需要进入系统并更新磁盘
- 创建存储过程
- 【杭电】[2124]Repair the Wall
- golang简单读写文件示例
- 测试询问框
- php之mvc模式的基本概念
- css不要在属性值与单位之间留有空格