hihocoder 1490 Tree Restoration

构造。

从最后一层开始往上构造。最后一层肯定都是叶子结点,距离为2的肯定是同一个父亲,确定好了父亲之后,可以确定上一层每个节点之间的距离,以及上一层每个节点到还未确定的叶子节点之间的距离。

#include<bits/stdc++.h>
using namespace std;

int n,m,k;
vector<int>v[110];
int A[110],L[110],h[110];
int D[110][110];
int f[110];

int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;i++) scanf("%d",&A[i]);
    for(int i=1;i<=m;i++)
    {
        while(A[i]--)
        {
            int x; scanf("%d",&x);
            v[i].push_back(x);
        }
    }
    for(int i=1;i<=k;i++) scanf("%d",&L[i]),h[L[i]]=1;
    for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) scanf("%d",&D[L[i]][L[j]]);

    for(int i=m;i>=2;i--)
    {
        int last = 0;
        int now = 0;
        while(1)
        {
            if(now==v[i].size()) break;

            while(1)
            {
                if(h[v[i-1][last]]==1) last++;
                else break;
            }

            f[v[i][now]] = v[i-1][last]; now++;
            while(1)
            {
                if(now==v[i].size()) break;
                if(D[v[i][now]][v[i][now-1]]!=2) {last++; break;}
                f[v[i][now]] = v[i-1][last]; now++;
            }
        }

        for(int j=0;j<v[i].size();j++)
            for(int t=0;t<v[i].size();t++)
                D[f[v[i][j]]][f[v[i][t]]]=D[v[i][j]][v[i][t]]-2;

        for(int j=0;j<v[i].size();j++)
            for(int t=1;t<=k;t++)
                D[f[v[i][j]]][L[t]]=D[L[t]][f[v[i][j]]]=D[v[i][j]][L[t]]-1;
    }

    for(int i=1;i<=n;i++)
    {
        printf("%d",f[i]);
        if(i<n) printf(" ");
        else printf("\n");
    }

    return 0;
}

 

posted @ 2017-04-07 10:35  Fighting_Heart  阅读(307)  评论(0编辑  收藏  举报