您的位置:首页 > 其它

UVa 10305 Ordering Tasks【拓扑排序】

2015-04-25 15:18 507 查看
题意:给出n件事情,m个二元组关系,求它们的拓扑序列

用的队列来做

#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

#define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)

typedef long long LL;
const int INF = (1<<30)-1;
const int mod=1000000007;
const int maxn=100005;
int ecnt;
int n,m;

int g[1005][1005],in[1005],ans[maxn];

void toposort(){
queue<int> q;

for(int i=1;i<=n;i++)
if(in[i]==0) q.push(i);

int cnt=0;
while(!q.empty()){
int tmp=q.front();q.pop();
ans[++cnt]=tmp;

for(int j=1;j<=n;j++){
if(g[tmp][j]){
in[j]--;
if(in[j]==0) q.push(j);
}
}
}

printf("%d",ans[1]);
for(int i=2;i<=cnt;i++)
printf(" %d",ans[i]);
printf("\n");
}

int main(){
while(scanf("%d %d",&n,&m)!=EOF){
if(n==0&&m==0) break;

memset(g,0,sizeof(g));
memset(in,0,sizeof(in));

while(m--){
int u,v;
cin>>u>>v;
g[u][v]=1;
in[v]++;
}
toposort();
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: