LA3027 - Corporative Network
题意:给N个结点,执行I或E操作,I u,v表示fa[u]=v且两者距离是abs(u-v)%1000,E x表示查询x结点到根节点的距离。
题解:带权并查集即可。
AC代码;
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define _for(i,a,b) for(int i=a;i<=b;i++)
const int maxn = 20005;
int n,t,m,fa[maxn],size[maxn],dis[maxn];
int find(int x)
{
if(fa[x]==x)return x;
int now = find(fa[x]);
dis[x]+=dis[fa[x]];
return fa[x]=now;
}
void intc()
{
_for(i,1,n)fa[i]=i;
_for(i,1,n)dis[i]=0;
}
int main(int argc, char const *argv[])
{
cin>>t;
while(t--)
{
cin>>n;
intc();
char s[3];
while(cin>>s)
{
if(s[0]=='O')break;
if(s[0]=='E')
{
int x;
cin>>x;
find(x);
cout<<dis[x]<<endl;
}
else if(s[0]=='I')
{
int x,y;
cin>>x>>y;
fa[x]=y;
dis[x]=abs(x-y)%1000;
}
}
}
return 0;
}
459

被折叠的 条评论
为什么被折叠?



