접속 비순환 그래프 트리로 간주 할 수있다. 나무의 높이가 선택한 루트에 따라 달라집니다. 이제 당신은 가장 높은 나무 결과 루트를 찾기로되어있다. 이러한 루트라고 가장 깊은 뿌리 .
입력 사양 :
각 입력 파일은 하나의 테스트 케이스가 포함되어 있습니다. 각 경우에있어서, 첫 번째 라인은 양의 정수를 포함 N 노드의 수이고, 따라서 노드 1부터 번호가 매겨 (≤104) N을 . 이어서 N -1 라인을 따라 각각 소정의 두 인접 노드의 수에 의해 에지를 설명한다.
출력 사양 :
각 테스트 케이스를 들어, 줄에 깊은 뿌리를 각각 인쇄 할 수 있습니다. 이러한 루트가 고유하지 않으면, 자신의 번호가 증가하는 순서를 인쇄 할 수 있습니다. 주어진 그래프 트리없는 경우, 프린트 그래프 접속 부품의 수이다.Error: K components
K
샘플 입력 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;
}