并查集

来源:互联网 发布:太平天国失败 知乎 编辑:程序博客网 时间:2024/06/16 03:09

并查集

Description

这是一道模板题。

维护一个 n 点的无向图,支持:

  • 加入一条连接 u 和 v 的无向边
  • 查询 u 和 v 的连通性

由于本题数据较大,因此输出的时候采用特殊的输出方式:用 0 或 1 代表每个询问的答案,将每个询问的答案一次从左到右排列,把得到的串视为一个二进制数,输出这个二进制数 mod 998244353 的值。

Input

第一行包含两个整数 n,m,表示点的个数和操作的数目。n≤4000000,m≤8000000接下来 m 行每行包括三个整数 op,u,v。

如果 op=0,则表示加入一条连接 u 和 v 的无向边;如果 op=1,则表示查询 u 和 v 的连通性。

Output

一行包括一个整数表示答案。

Sample Input 1 

3 61 1 00 0 11 0 11 1 20 2 11 2 1
//sum计算时就要mod......
#include <iostream>#include <stdio.h>#include <cstring>#include <cmath>using namespace std;const long long Mod=998244353;int n,m;int op,u,v;int f[4000004];int Find(int a){    if(f[a]==a)return a;    return f[a]=Find(f[a]);}void unit(int a,int b){    if(a>b)    {        int t=a;        a=b;        b=t;    }    int x=Find(a);    int y=Find(b);    if(x!=y)f[y]=x;}int main(){    scanf("%d%d",&n,&m);    long long sum=0;    for(int i=0;i<n;i++)        f[i]=i;    for(int i=0;i<m;i++)    {        scanf("%d%d%d",&op,&u,&v);        if(op==0)        {            unit(u,v);           // cout<<f[u]<<" "<<f[v]<<endl;        }        if(op==1)        {            if(Find(u)==Find(v))            {               sum=sum<<1;               sum++;               sum=sum%Mod;       //边sum边mod!!!!!              // cout<<sum<<endl;            }            else            {                 sum=sum<<1;                 sum=sum%Mod;                 // cout<<sum<<endl;            }        }    }    cout<<sum%Mod<<endl;   /* if(sum>Mod)    {         sum-=Mod;         cout<<sum<<endl;    }    else cout<<sum<<endl;  */return 0;}
















阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 悭吝读音 悭吝的读音 悭吝怎么读 吝人卖尸 出纳之吝 鄙吝意消 粉吝红悭 吝读音 吝的拼音 出内之吝 吝什么意思 吝成语疯狂看图猜成语 可以跟老师说不吝赐教吗 快穿之男神,有点苏 棠不吝 吴怀先不让周莹入祖坟 不周山 周不疑 共工怒触不周山 34周为什么不建议保胎 共工触不周山 不周山在中国哪里 策行三国庄不周 为啥超过26周不能做四维 不周山回归 孕40周还不生怎么办 孕40周不生下蹲催生图片 周为什么不敢对抗毛 迫不及待地进入小周后 巫师3一周目不要刷太高等级 君子不器周而不比 周而不比 不食周粟 庄不周作品 男友超过一周不联系你 不周山在如今什么位置 衣食不周 不周 后周 楚庄不周 三国小霸王庄不周 硫糖铝为什么不能吃超过一周