PAT-1021 깊은 루트 (25 분) + 트리 이산 세트 링과 연결 필요한 깊이를 판단

접속 비순환 그래프 트리로 간주 할 수있다. 나무의 높이가 선택한 루트에 따라 달라집니다. 이제 당신은 가장 높은 나무 결과 루트를 찾기로되어있다. 이러한 루트라고 가장 깊은 뿌리 .

입력 사양 :

각 입력 파일은 하나의 테스트 케이스가 포함되어 있습니다. 각 경우에있어서, 첫 번째 라인은 양의 정수를 포함 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