树,或者深林 变成二叉树:

儿子变做儿子 ,兄弟 便有儿子 

小注意 : 定义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\n",f[i]); 
    
}
变变变

 

posted @ 2021-10-24 21:15  VxiaohuanV  阅读(40)  评论(0编辑  收藏  举报