链接
https://vjudge.net/problem/UVA-1329
题解
路径压缩的时候要维护距离信息
大体是这么个流程:
- 先把 x x x的父亲信息处理好(递归)
- 因为父亲的信息已经是很简单的了,所以我可以直接递推出 x x x的信息
代码
#include <bits/stdc++.h>
#define maxn 1000010
using namespace std;
typedef long long ll;
class MFS
{
private:
ll f[maxn], dist[maxn], N;
public:
void init(ll n)
{
N=n;
for(auto i=1;i<=n;i++)f[i]=i, dist[i]=0ll;
}
ll find(ll x)
{
if(x==f[x])return x;
ll y=find(f[x]);
dist[x]=dist[x]+dist[f[x]];
f[x]=y;
return f[x];
}
void merge(ll a, ll b)
{
f[a]=b;
dist[a]=dist[a]+(abs(a-b)%1000);
}
ll get_dist(ll x)
{
find(x);
return dist[x];
}
}mfs;
ll read(ll x=0)
{
ll c, f=1;
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-48;
return f*x;
}
char s[10];
int main()
{
ll T=read(), N, u, v;
while(T--)
{
N=read();
mfs.init(N);
while(1)
{
scanf("%s",s);
if(s[0]=='O')break;
if(s[0]=='I')
{
u=read(), v=read();
mfs.merge(u,v);
}
if(s[0]=='E')
{
u=read();
printf("%lld\n",mfs.get_dist(u));
fflush(stdout);
}
}
}
return 0;
}