4
11
2015
0

XJOI 1043 二叉树转化

//做法略暴力
#include <iostream>
using namespace std;

int n,a[101][101],l[101],r[101];

void edit(int x) //编辑结点x
{
    int last=0; //上一个x的子结点
    for (int i=1;i<=n;++i)
        if (a[x][i]) {
            if (last) { //若不是第一个结点
                a[x][i]=0;
                a[last][i]=1;
                r[last]=i;
            } //连接上一个结点与该结点,该结点作为上一个结点的右儿子
            else l[x]=i; //第一个结点作为父结点的左儿子
            last=i;
            edit(i); //递归的编辑结点i
        }
}

int main()
{
    cin>>n;
    for (int i=1;i<=n;++i) {
        int t,x; cin>>t;
        for (int j=0;j<t;++j) {
            cin>>x;
            if (x) a[i][x]=1;
        }
    }
    edit(1);
    cout<<n<<endl;
    for (int i=1;i<=n;++i)
        cout<<l[i]<<' '<<r[i]<<endl;
    return 0;
}
Category: 题解 | Tags: XJOI 数据结构 二叉树

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com