PAT-1021最深ルート(25分)ツリー+の互いに素なセットリングとの接続に必要な深さを決定されます

接続及び非環式のグラフはツリーと考えることができます。木の高さは、選択したルートに依存します。今、あなたは最高の木につながるルートを見つけることになっています。このようなルートが呼ばれる最も深い根

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、正の整数含まNノードの数であるので、ノードは1から番号が付けられている(≤104)Nを次いで、N -1線は、次のそれぞれは、所与の隣接ノードの数によってエッジを記述する。

出力仕様:

各テストケースのために、ラインの最も深い根のそれぞれを印刷します。そのようなルートが一意でない場合は、その番号の昇順でそれらを印刷します。与えられたグラフがツリーでない場合、印刷にグラフにおける連結成分の数です。Error: K componentsK

サンプル入力1:

5
1 2
1 3
1 4
2 5

サンプル出力1:

3
4
5

サンプル入力2:

5
1 3
1 4
2 5
3 4

サンプル出力2:

Error: 2 components

暴力から支払わ、実際にオーバー、キーがツリーの深さを見つけることです、主な問題は、このピット、そうでない場合は、情報が、唯一の通信ブロックのリングと、その出力すべき出力する木であります

エラー:1つのコンポーネント

それはロジック判断されることに注意してください

int dfs(int x)
{
    //de(x);
    vis[x]=1;
    int ma=0;
    for(int i=0;i<(int)G[x].size();i++){
        int v=G[x][i];
       if(vis[v])continue;
        ma=max(ma,dfs(G[x][i]));
    }
    return ma+1;
}
#include <iostream>
#include<bits/stdc++.h>
#define each(a,b,c) for(int a=b;a<=c;a++)
#define de(x) cout<<#x<<" "<<(x)<<endl
using namespace std;

const int maxn=1e4+5;
int father[maxn];   //  储存i的father父节点

void makeSet(int n) {
    for (int i = 1; i <=n; i++)
        father[i] = i;
}

int findRoot(int x) {   //  迭代找根节点
    int root = x; // 根节点
    while (root != father[root]) { // 寻找根节点
        root = father[root];
    }
    while (x != root) {
        int tmp = father[x];
        father[x] = root; // 根节点赋值
        x = tmp;
    }
    return root;
}

void Union(int x, int y) {  //  将x所在的集合和y所在的集合整合起来形成一个集合。
    int a, b;
    a = findRoot(x);
    b = findRoot(y);
    father[a] = b;  // y连在x的根节点上   或father[b] = a为x连在y的根节点上;
}
vector<int>G[maxn];
/*
5
1 2
1 3
1 4
2 5
*/
int maxx;
int depth[maxn];
int vis[maxn];
int dfs(int x)
{
    //de(x);
    vis[x]=1;
    int ma=0;
    for(int i=0;i<(int)G[x].size();i++){
        int v=G[x][i];
       if(vis[v])continue;
        ma=max(ma,dfs(G[x][i]));
    }
    return ma+1;
}
int main()
{
    int n;
    cin>>n;
    makeSet(n);
    int m=n-1;
    int a,b;
    int tree_flag=true;
    while(m--)
    {
        scanf("%d%d",&a,&b);
        if(findRoot(a)!=findRoot(b)){
            Union(a,b);
        G[a].push_back(b);
        G[b].push_back(a);
        }
        else tree_flag=false;

    }
    //int components=0;
    set<int>s;
    for(int i=1;i<=n;i++)
    {
        //de(i);
        //de(findRoot(i));
        s.insert(findRoot(i));
    }
    //de(s.size());
    if(tree_flag==false||s.size()!=1)
    {
        printf("Error: %d components\n",(int)s.size());
        return 0;
    }
    maxx=0;
    each(i,1,n)
    {
        memset(vis,0,sizeof(vis));
        //de(i);
        depth[i]=dfs(i);
    }
    each(i,1,n)
    {
        maxx=max(maxx,depth[i]);
    }
    each(i,1,n)
    {
        if(depth[i]==maxx)
        {
            cout<<i<<endl;
        }
    }

    return 0;
}

おすすめ

転載: www.cnblogs.com/Tony100K/p/11758035.html