紫书章六例题15 给任务排序 UVA 10305(拓扑排序)
2017-04-17 17:08
363 查看
题意:给你n个任务,但是这n个任务并不是独立的,意思就是有些任务必须在其他任务完成后才能开始做。法1:将之看为一个有向图,入度为0的入队,出队后,将以出队的这点为起点的边入度减一,然后再将没入队过的且入度为0的点入队。这个方法还可以看有没有有向环,即最后所有点没有全部被遍历到。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <sstream> #include <cmath> #include <queue> #include <vector> #include <queue> using namespace std; int n,m; struct node { int to,pre; }; int head[105]; int rd[105]; int vis[105]; node e[10000]; void add(int i,int from,int to) { e[i].to=to;e[i].pre=head[from];head[from]=i; } int main() { while(scanf("%d %d",&n,&m)!=EOF&&m+n) { memset(head,-1,sizeof(head)); memset(rd,0,sizeof(rd)); memset(vis,0,sizeof(vis)); memset(e,0,sizeof(e)); int h=0; for(int i=0;i<m;i++) { int a,b; scanf("%d %d",&a,&b); add(h,a,b);h++; rd[b]++; } queue<int> q; for(int i=1;i<=n;i++) { if(rd[i]==0) {q.push(i);vis[i]=1;} } int flag=0; while(!q.empty()) { int t=q.front(); q.pop(); if(flag) printf(" "); printf("%d",t); flag=1; for(int i=head[t];i>-1;i=e[i].pre) { node temp=e[i]; if(!vis[temp.to]) rd[temp.to]--; } for(int i=1;i<=n;i++) { if(!vis[i]&&rd[i]==0) {vis[i]=1;q.push(i);} } } printf("\n"); } return 0; }
相关文章推荐
- 紫书章六例题15 给任务排序 UVA 10305(拓扑排序)
- 紫书章六例题15 给任务排序 UVA 10305(拓扑排序)
- 紫书章六例题15 给任务排序 UVA 10305(拓扑排序)
- 紫书章六例题15 给任务排序 UVA 10305(拓扑排序)
- 紫书章六例题15 给任务排序 UVA 10305(拓扑排序)
- 紫书章六例题15 给任务排序 UVA 10305(拓扑排序)
- 紫书章六例题15 给任务排序 UVA 10305(拓扑排序)
- 例题6-15 给任务排序 UVA 10305(拓扑排序)
- 例题6-15 给任务排序(Ordering Tasks, UVa 10305)
- 例题 6-15 UVA 10305 Ordering Tasks 给任务排序
- 例题6-15 UVa10305 Ordering Tasks(拓扑排序)
- Uva10305给任务排序(拓扑排序 板子题)
- 拓扑排序(给任务排序,UVA 10305)
- 例题:给任务排序(UVa 10305)
- 6_15 给任务排序(UVa10305)<拓扑排序>
- Uva10305 Ordering Tasks 【拓扑排序】【例题6-15】
- 给任务排序(Ordering Tasks,UVa 10305)
- UVa 10305 给任务排序
- 10305UVa给任务排序
- UVA 10305 给任务排序