当前位置: 代码迷 >> 综合 >> Corporative Network(LA 3027,带权并查集母题)
  详细解决方案

Corporative Network(LA 3027,带权并查集母题)

热度:82   发布时间:2024-01-22 02:02:11.0

题意:

两个操作:I u v:把节点u的父节点设为v,距离为|u-v|%1000。输入的u无父节点。

          E u:询问u到根节点的距离。

题解:

      这个可以说是带权并查集的母题了,只不过这里的距离是最直观的节点到根节点的距离,开个权值数组,记录每个节点到根节点的距离即可。

      像食物链那类的带权并查集题,距离就是显得抽象了点,思想都在这道题里了。

 

 

 

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<vector>
#include<functional>
#include<utility>
#include<set>
#include<map>
#include<cmath>
#include<stack>using namespace std;const int maxn=20000+10;int pa[maxn],d[maxn];int findset(int x)
{if(pa[x]==-1)return x;else{int root=findset(pa[x]);d[x]+=d[pa[x]];//更新高度return pa[x]=root;}
}
int main()
{int T;cin>>T;while(T--){int n,u,v;char s[15];cin>>n;for(int i=1;i<=n;i++){pa[i]=-1;d[i]=0;}while(scanf("%s",s)&&s[0]!='O'){if(s[0]=='E'){cin>>u;findset(u);cout<<d[u]<<endl;}if(s[0]=='I') {cin>>u>>v;pa[u]=v;d[u]=abs(u-v)%1000;}}}
}

  相关解决方案