接続及び非環式のグラフはツリーと考えることができます。木の高さは、選択したルートに依存します。今、あなたは最高の木につながるルートを見つけることになっています。このようなルートが呼ばれる最も深い根。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、正の整数含ま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;
}