重拾PAT。学习了map.vector.set.迭代器,温习了并查集.dfs等等。
具体做法就是先dfs到一些点,再从这些点dfs,前后得到的点就是总的集合。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <map>
#include <vector>
#include <set>
using namespace std;
const int maxx = 10001;
map <int, vector<int>> tree;
set <int> res;
set <int> tres;
int pre[maxx], cnt, maxn = -1;
int visit[maxx];
void dfs(int p, int step)
{
if (step > maxn)
{
res.clear();
res.insert(p);
maxn = step;
}
else if (step == maxn)
{
res.insert(p);
}
vector<int>::iterator it;
it = tree[p].begin();
for(;it!=tree[p].end();it++)
{
if(visit[*it]!=1)
{
visit[*it]=1;
dfs(*it,step+1);
visit[*it]=0;
}
}
}
void init()
{
for (int i = 0; i < maxx; ++i) {
pre[i]=i;
visit[i]=0;
}
}
//以下并差集部分
int root(int i)
{
if(pre[i]!=i)
pre[i]=root(pre[i]);
return pre[i];
}
void merge(int x,int y)
{
int fa,fb;
fa = root(x);
fb = root(y);
if(fa!=fb)
{
pre[fa] = fb;
cnt--;
}
}
int main() {
int n,i,a,b;
scanf("%d", &n);
init();
cnt = n-1;
for(i = 0;i<n-1;i++)
{
scanf("%d %d",&a,&b);
tree[a].push_back(b);
tree[b].push_back(a);
merge(a,b);
}
if(cnt!=0)
{
printf("Error: %d components\n",1+cnt);
return 0;
}
visit[1]=1;
dfs(1,1);
visit[1]=0;
set<int>::iterator ite = res.begin();
int point = *ite;
for(;ite!=res.end();ite++)
tres.insert(*ite);
visit[point] = 1;
dfs(point,1);
visit[point] = 0;
for(ite = res.begin();ite!=res.end();ite++)
tres.insert(*ite);
for(ite = tres.begin();ite!=tres.end();ite++)
printf("%d\n",*ite);
return 0;
}