【LOJ 109 并查集】 并查集

本文解析了一道涉及并查集算法的模板题,详细介绍了如何通过并查集解决无向图的连通性问题,包括加入无向边和查询两点是否连通的功能实现。文章提供了完整的AC代码示例,并采用了特殊输出方式,将查询结果转化为二进制数后取模输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

这是一道模板题。
维护一个 n 点的无向图,支持:

  • 加入一条连接 u 和 v 的无向边
  • 查询 u 和 v 的连通性
    由于本题数据较大,因此输出的时候采用特殊的输出方式:用 0 或 1 代表每个询问的答案,将每个询问的答案依次从左到右排列,把得到的串视为一个二进制数,输出这个二进制数 mod 998244353 的值。

分析

简单的并查集。

AC代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=8000005;
const int Mod=998244353;
struct Edge{
    int u,v;
}edge[maxn];
int a[maxn],fa[maxn];
int n,m,nedge,ans;
inline int read() {
    int x=0,w=0;char ch=0;
    while (!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while (isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return w?-x:x;
}
void addedge(int a,int b) {
    edge[nedge]=(Edge){a,b};
}
inline int gf(int x) {
    return fa[x]==x?fa[x]:fa[x]=gf(fa[x]);
}
int main() {
    n=read(),m=read();
    for (int i=1;i<=n;i++) fa[i]=i;
    nedge=0; int cnt=0;
    while (m--) {
        int opt=read(),u=read(),v=read();
        if (opt==0) {
            addedge(u,v); addedge(v,u);
            int ance1=gf(u),ance2=gf(v);
            if (ance1!=ance2) fa[ance1]=ance2;
        } 
        else {
            int ance1=gf(u),ance2=gf(v);
            if (ance1==ance2) a[++cnt]=1;
            else a[++cnt]=0;
        }
    }
    int x=1;
    while (a[x]==0) x++;
    for (int i=cnt;i>=x;i--) ans=(ans*2+a[i])%Mod;
    printf("%d\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/Dawn-Star/p/9803495.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值