这是刘汝佳算法入门上的一道拓扑排序题目。拿来练练手,题目采用dfs对有向无环图进行排序。每找到一个数,人如果有比它大的就继续dfs递归,直到最大的数,然后开始逆序存储到topo数组里面。(特别注意题目有坑,m可以为0 呀!)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define maxn 10000
using namespace std;
int t,topo[maxn],vis[maxn],G[maxn][maxn],n,m;
int dfs(int u)
{
int i;
vis[u]=-1; //设置访问标志
for(i=0;i<n;i++)
{
if(G[u][i]){
if(vis[i]==-1) return 0;//存在有向环
if(!vis[i]&&!dfs(i)) return 0;
}
}
vis[u]=1; //访问结束
topo[--t]=u;
return 1;
}
int toposort()
{
for(int i=0;i<n;i++)
{
if(!vis[i]){
if(!dfs(i)) return 0;//排序失败
}
}
return 1;
}
int main()
{
// freopen("input.txt","r",stdin);
while(scanf("%d%d",&n,&m)&&n){//注意m有可能为0
t=n;
memset(vis,0,sizeof(vis));
memset(G,0,sizeof(G));
int a,b;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
G[a-1][b-1]=1;
}
if(toposort()){
for(int i=0;i<n;i++)
{
printf("%d",topo[i]+1);
if(i==n-1) printf("\n");
else printf(" ");
}
}
}
return 0;
}