树,或者深林 变成二叉树:
儿子变做儿子 ,兄弟 便有儿子
小注意 : 定义2个父亲。
#include <bits/stdc++.h> using namespace std; #define ri register int #define M 105 int n,m; int fa[M],f[M]; vector <int> q,p[M]; int flag[M]; void dfs(int a) { //if(p[a].size()) sort(p[a].begin(),p[a].begin()+p[a].size()); for(ri i=0;i<p[a].size()&&i<1;i++) { f[p[a][i]]=a; flag[p[a][i]]=1; dfs(p[a][i]); break; } int b=fa[a]; if(a!=0) { //if(p[b].size()) sort(p[b].begin(),p[b].begin()+p[b].size()); for(ri i=0,trmp=0;i<p[b].size();i++) { if(!flag[p[b][i]]) { flag[p[b][i]]=1; f[p[b][i]]=a; dfs(p[b][i]); break; } } } } int main(){ scanf("%d%d",&n,&m); for(ri i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); p[a].push_back(b); fa[b]=a; } for(ri i=1;i<=n;i++) { if(fa[i]==0) q.push_back(i); } for(ri i=0;i<q.size();i++) { int a=q[i]; fa[a]=0; p[0].push_back(a); } dfs(0); for(ri i=1;i<=n;i++) printf("%d ",f[i]); }