Uva 10305 Ordering Tasks

题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=1246
拓扑排序,直接dfs,具体看刘汝佳的《算法竞赛入门经典》。而且这道题目的题意是一定存在拓扑排序,所以更加简单。

#include<stdio.h>
#include<string.h>
#define MAXN 100+10

int vis[MAXN],edge[MAXN][MAXN],topo[MAXN],t,n;

void dfs(int i)
{
	int j;
	for(j=1;j<=n;j++)
		if(edge[i][j]&&!vis[j])
		{
			vis[j]=1;
			dfs(j);
		}
	topo[t--]=i;
}
int main()
{
	int i,m;
	for(;;)
	{
		scanf("%d%d",&n,&m);
		if(n==0&&m==0) break;
		memset(vis,0,sizeof(vis));
		memset(edge,0,sizeof(edge));
		while(m--)
		{
			int a,b;
			scanf("%d%d",&a,&b);
			edge[a][b]=1;
		}
		t=n;
		for(i=1;i<=n;i++)
			if(!vis[i])
			{
				vis[i]=1;
				dfs(i);
			}
		for(i=1;i<=n;i++)
		{
			printf("%d",topo[i]);
			if(i==n) putchar('\n');
			else putchar(' ');
		}
	}
	return 0;
}
 

 

你可能感兴趣的:(uva,10305,Ordering Tasks)