题意:
小Hi的学校总共有N名学生,编号1-N。学校刚刚进行了一场全校的古诗文水平测验。
学校没有公布测验的成绩,所以小Hi只能得到一些小道消息,例如X号同学的分数比Y号同学的分数高S分。
小Hi想知道利用这些消息,能不能判断出某两位同学之间的分数高低?
题解:
带权并查集模板,注意合并的时候赋值情况即可
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int fa[N],sco[N];
int finds(int x){
if(fa[x]<0)
return x;
int f=fa[x];
fa[x]=finds(fa[x]);
sco[x]+=sco[f];
return fa[x];
}
void merge(int x,int y,int s){
int fax=finds(x),fay=finds(y);
if(fax!=fay){
if(fa[fax]>fa[fay]){
fa[fay]+=fa[fax];
fa[fax]=fay;
sco[fax]=sco[y]+s-sco[x];
}
else{
fa[fax]+=fa[fay];
fa[fay]=fax;
sco[fay]=sco[x]-sco[y]-s;
}
}
}
int main()
{
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
memset(fa,-1,sizeof(fa));
int x,y,s;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&s);
merge(x,y,s);
}
while(q--){
scanf("%d%d",&x,&y);
if(finds(x)!=finds(y))
printf("-1\n");
else
printf("%d\n",sco[x]-sco[y]);
}
return 0;
}
来源:CSDN
作者:天翼之城
链接:https://blog.csdn.net/tianyizhicheng/article/details/104778256