• 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;
    }
  • 相关阅读:
    Spring读取properties内容
    SpringBoot全局异常处理
    Hibernate入门
    Oracle查询表及注释
    MySQL重复与不重复问题
    IDEA中other settings不见了
    01程序员修炼之道
    团队冲刺(四)
    单词字母查询频率
    学习进度(9)
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9503771.html
Copyright © 2020-2023  润新知