题目链接
题目大意
有n个学生,已知m个信息,每个信息说明了x比y高多少分。有q个询问,每个询问输出x比y高多少分,不能判断的输出-1
解题思路
用带权并查集
x比y高多少分,就是x和y这个关系上的权值。
当x和y没有公共祖先节点的时候就输出-1。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int fa[N],rela[N],n,m,q;
void init()
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
rela[i]=0;
}
}
int findd(int x)
{
if(x==fa[x])
return x;
else
{
int a=fa[x];
fa[x]=findd(fa[x]);
rela[x]=rela[a]+rela[x];
return fa[x];
}
}
void me(int x,int y,int z)
{
int t1=findd(x);
int t2=findd(y);
if(t1!=t2)
{
fa[t1]=t2;
rela[t1]=-rela[x]+rela[y]+z;
}
}
int check(int x,int y)
{
if(findd(x)==findd(y))
{
int re=rela[x]-rela[y];//计算x比y高的分数
return re;
}
else//没有公共祖先节点
return -1;
}
int main()
{
while(~scanf("%d %d %d",&n,&m,&q))
{
init();
int x,y,z;
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&z);
me(x,y,z);
}
for(int i=1;i<=q;i++)
{
scanf("%d %d",&x,&y);
printf("%d\n",check(x,y));
}
}
return 0;
}