BZOJ4690 Never Wait for Weights(带权并查集模板题)

来源:互联网 发布:四九圣尊兑换码 淘宝 编辑:程序博客网 时间:2024/06/03 20:22

题意:

一共有n个物品;输入:? a b w 表示b比a重w,! a b 表示输出b比a重多少;

思路:

对每个? a b w;建立a、b的并查集,维护dis数组。dis[x]表示x比x的父亲fa[x]重多少;

代码:

#include <bits/stdc++.h>using namespace std;int fa[100100];long long dis[100100];int n,m;int fi(int x){    if(fa[x]==x)        return x;    int root = fi(fa[x]);    dis[x] += dis[fa[x]];    fa[x] = root;    return root;}void uni(int x,int y,int d){    int fx = fi(x);    int fy = fi(y);    if(fx!=fy)    {        fa[fy] = fx;        dis[fy] = dis[x]-dis[y]+d;    }}int main(){    while(~scanf("%d%d",&n,&m)&&(n!=0||m!=0))    {        memset(dis,0,sizeof(dis));        for(int i = 0;i<=n;i++)            fa[i] = i;        while(m--)        {            char s[5],op;            int a,b,w;            scanf("%s",s);            op = s[0];            if(op=='!')            {                scanf("%d%d%d",&a,&b,&w);                uni(a,b,w);            }            else            {                scanf("%d%d",&a,&b);                if (fi(a)!=fi(b))                    printf("UNKNOWN\n");                else                    printf("%d\n",dis[b]-dis[a]);            }        }    }    return 0;}

原创粉丝点击