求无向图连通分量 还是并查集快一点
#include<bits/stdc++.h>
#define inf 99999999
using namespace std;
vector<int> v[10005];
int vis[10005];
set<int> s;
int maxx=-1,max1=-1;
int parent[10005],ran[10005],dep[10005];
int find(int x)
{
if(x==parent[x])
return x;
return parent[x]=find(parent[x]);
}
void union_set(int x,int y)
{
int x_root=find(x);
int y_root=find(y);
if(x_root==y_root)
return;
if(ran[x_root]>ran[y_root])
parent[y_root]=x_root;
else if(ran[x_root]<ran[y_root])
parent[x_root]=y_root;
else{
parent[y_root]=x_root;
ran[x_root]++;
}
}
struct node{
int x;
int step;
};
void bfs(int x)
{
queue<node> q;
node p;
p.x=x;
p.step=1;
vis[x]=1;
q.push(p);
while(!q.empty())
{
node u=q.front();
if(u.step>maxx)
{
maxx=u.step;
}
q.pop();
for(int i=0;i<v[u.x].size();i++)
{
if(vis[v[u.x][i]]==0)
{
vis[v[u.x][i]]=1;
node pp;
pp.x=v[u.x][i];
pp.step=u.step+1;
q.push(pp);
}
}
}
}
int main()
{
int n,a,b;
cin>>n;
for(int i=0;i<10005;i++)
parent[i]=i;
for(int i=1;i<n;i++)
{
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
union_set(a,b);
}
int cnt=0;
for(int i=1;i<=n;i++)
{
s.insert(find(i));
}
if(s.size()>1)
{
cout<<"Error: "<<s.size()<<" components"<<endl;
}
else
{
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
maxx=-1;
bfs(i);
dep[i]=maxx; //从i点起始的最大深度
if(maxx>max1)
max1=maxx; //保存最大深度
}
for(int i=1;i<=n;i++)
{
if(dep[i]==max1) //如果等于最大深度
cout<<i<<endl;
}
}
return 0;
}