HihoCoder 1515 分数调查 —— 带权并查集模板

风流意气都作罢 提交于 2020-03-10 20:38:10

This way

题意:

小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;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!