hrbust 2240 带权并查集

来源:互联网 发布:2016淘宝热销产品 编辑:程序博客网 时间:2024/05/16 01:46

一开始要用folyd做

但是爆数组了

参考大佬代码带权并查集

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#define ll long longusing namespace std;int f[100005];int sum[100005];int find(int x){   if(f[x]!=x)   {       int pre=f[x];       f[x]=find(f[x]);       sum[x]+=sum[pre];   }   return f[x];}void init(int n){    for(int i=0;i<=n;i++)        f[i]=i;}int main(){    int n;    while(~scanf("%d",&n))    {        int t;        init(n);        memset(sum,0,sizeof(sum));        for(int i=0;i<n;i++)        {            scanf("%d",&t);            if(t==1)            {                int x,y,z;                scanf("%d%d%d",&x,&y,&z);                int X=find(x),Y=find(y);                if(X!=Y)                {                    sum[X]=z+sum[y]-sum[x];                    f[X]=Y;                }            }            else            {                int x,y;                int X,Y;                scanf("%d%d",&x,&y);                X=find(x),Y=find(y);                if(X==Y)                {                    printf("%d\n",sum[x]-sum[y]);                }                else                    printf("?\n");            }        }    }}

0 0