Gym

题意:一个顶点数为N的生成树,对于每个点i,我们按照与i的距离给出顺序,即dis i 1<=dis i 2<=dis i 3<=...,现在让你输出N-1条边,即还原这棵树。

思路:首先应该得到距离为1的点对,那些肯定是树边,然后这样得到的树边可能<N-1,后面不容易判定哪些是树边。搜索什么的都不好搞。

正解:先假定一个点为树根,那么我们按照距离根的距离由远到近来得到树边。这样保证了得到的树边由下指向上,保证了刚刚好N-1条边。

3
2
1 2
2 1
5
1 4 5 3 2
2 3 4 1 5
3 4 2 5 1
4 3 1 5 2
5 4 3 1 2
3
1 3 2
2 1 3
3 1 2
Output
2 1 



2 3
3 4
5 4
4 1


2 1
3 1
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=2010;
int a[maxn][maxn],vis[maxn]; 
int main()
{
    int T,N;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&N);
        rep(i,1,N) rep(j,1,N) scanf("%d",&a[i][j]);
        int now=N;
        while(true){
            int x=a[1][now],y=2;
            while(vis[a[x][y]]) y++;
            printf("%d %d
",a[x][y],x);
            vis[x]=1; now--;
            if(now==1) break;
        }
        puts(""); 
        memset(vis,0,sizeof(vis));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/hua-dong/p/9503771.html