RT,小蒟蒻刚学DFS,自己看了下题意就想到了这个解法,但不知道为什么一直WA,跟题解改的越来越像了,救救蒟蒻吧QAQ!!! Code:
#include<bits/stdc++.h>
using namespace std;
#define re register
#define N 600010
int n,m,q,kx,ky,opt,h[N],cnt=1,fa[N],dis[N],maxa,kiss;
struct STAR{int v,w,nxt;}e[N<<1];
void add(int u,int v){e[++cnt]=(STAR){v,h[u]};h[u]=cnt;}
int getfa(int x){return fa[x]==x?x:fa[x]=getfa(fa[x]);}
char vis[N];
void DFS(int x,int faz,int num)
{
if(num>maxa) maxa=num,kiss=x;
for(re int i=h[x];i;i=e[i].nxt)
{
int v=e[i].v;
if(v==faz)continue;
DFS(v,x,num+1);
}
return;
}
int main()
{
cin>>n>>m>>q;
for(re int i=1;i<=n;++i) fa[i]=i;
for(re int i=1;i<=m;++i)
{
scanf("%d%d",&kx,&ky),add(kx,ky),add(ky,kx);
if(getfa(kx)!=getfa(ky)) fa[getfa(kx)]=getfa(ky);
}
for(re int i=1;i<=n;++i)
if(!vis[getfa(i)])
{
vis[getfa(i)]=1;
maxa=-0x3fffffff;
DFS(i,0,0);
maxa=-0x3fffffff;
DFS(kiss,0,0);
dis[getfa(i)]=maxa;
}
while(q--)
{
scanf("%d",&opt);
if(opt==1)
{
scanf("%d",&kx);
int fax=getfa(kx);
printf("%d\n",dis[fax]);
}
else
{
scanf("%d%d",&kx,&ky);
int fax=getfa(kx),fay=getfa(ky);
if(fax==fay)continue;
fa[fax]=fay;
dis[fay]=max((dis[fax]+1)/2+(dis[fay]+1)/2+1
,max(dis[fax],dis[fay]));
}
}
return 0;
}