拓扑排序
可以用DFS求出有向无环图(DAG)的拓扑排序。如果排序失败,说明该有向图存在有向环,不是DAG。
// uva 10305
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int G[105][105] ;
int vis[105];
int sort[105];
int t;
int m,n;
bool dfs(int u){
vis[u]=-1;
// 标记正在访问点
for(int v=1;v<=m;v++){
if(G[u][v]) { // 以u开始延申
if(vis[v]<0) return false; //如果又遇到正在访问的点则成环
else if( !vis[v]&&!dfs(v)) return false;
// v 点没有被访问 访问v进入v点 且若访问遇到环则dfs return false
}
}
vis[u]=1; //访问结束标志
sort[--t]=u;
return true;
}
int main(){
//freopen("10305.txt","r",stdin);
while(~scanf("%d%d",&m,&n)&&m+n){ // n 可能是0
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
t=m;
for(int i=0;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u][v]=1;
}
for(int i=1;i<=m;i++){
if(!vis[i])
dfs(i);
}
for(int i=0;i<m;i++){
cout<<sort[i]<<" ";
}
cout<<endl;
}
return 0;
}