题目要求长辈有分,子孙不能排在长辈前面,输出顺序,那么这样来看这就是一个拓扑排序题,开始以为是一个求路径最大的问题,不过存在两节点间并没有关系WA了一次,后面再想题目好像有多解,只要输出一种方案即可,那么细想一下这就是一个拓扑排序了,只要利用dfs回溯从后往前排,把每个结点的子孙往后排,然后不断将访问结束的点插入到首部就好,由于这里明确是一个有向无环图(DAG),所以还可以省略判断直接排序。
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=105;
int topo[maxn],vis[maxn];
int n,t;
vector <int> G[maxn];
void dfs(int u){
vis[u]=-1;
for(int i=0;i<G[u].size();i++){
if(!vis[G[u][i]])dfs(G[u][i]);
}
vis[u]=1;topo[--t]=u;
}
void toposort(){
t=n;
memset(vis,0,sizeof(vis));
for(int u=1;u<=n;u++)if(!vis[u]){
dfs(u);
}
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++)G[i].clear();
int x;
for(int i=1;i<=n;i++)
while(scanf("%d",&x)&&x)G[i].push_back(x);
toposort();
printf("%d",topo[0]);
for(int i=1;i<n;i++)printf(" %d",topo[i]);
printf("\n");
}
return 0;
}