题目大意:有n个火星人,分别输入出他们的孩子,将他们排序使得孩子不能在父亲之前。
思路分析:拓扑排序。。。。
下面是dfs算法:
dfs算法每次判断该点及其后代是否有环,若存在环则其拓扑排序不存在,然后从后代往前逐个保存
#include<stdio.h>
#include<string.h>
int A[110][110],B[110],n,t,vis[110];
int dfs(int u){
vis[u]=-1;
int i;
for(i=1;i<=n;i++){
if(A[u][i]){
if(vis[i]==-1) return 0;
else if(vis[i]==0&&dfs(i)==0) return 0;
}
}
vis[u]=1;
B[t--]=u;
return 1;
}
int main(){
int i,j,a;
while(scanf("%d",&n)!=EOF){
memset(vis,0,sizeof(vis));
memset(A,0,sizeof(A));
for(i=1;i<=n;i++){
while(1){
scanf("%d",&a);
if(a==0) break;
A[i][a]=1;
}
}
t=n;
int ans=1;
for(i=1;i<=n;i++) if(vis[i]==0&&dfs(i)==0) ans=0;
if(ans) for(i=1;i<n;i++) printf("%d ",B[i]);
printf("%d\n",B[n]);
}
return 0;
}