博客
关于我
luogu_1197 [JSOI2008]星球大战
阅读量:791 次
发布时间:2023-02-06

本文共 1215 字,大约阅读时间需要 4 分钟。

#include 
#include
#include
using namespace std;// 代码开始vector
G[N], b(N, 0);int find(int x) { if (p[x] != x) p[x] = find(p[x]); return p[x];}int main() { int n, m, k; scanf("%d %d", &n, &m); for (int i = 1; i <= n; ++i) p[i] = i; for (int i = 1; i <= m; ++i) { int x, y; scanf("%d %d", &x, &y); G[x].push_back(y); G[y].push_back(x); } int sum = n - k; for (int i = 1; i <= k; ++i) { int a; scanf("%d", &a); b[a] = 1; } for (int i = 1; i <= n; ++i) { if (b[i]) continue; for (int j = 0; j < G[i].size(); ++j) { int v = G[i][j]; if (find(v) != i && !b[v]) { sum--; p[find(v)] = i; } } } for (int i = k; i <= n; ++i) { ans[i] = sum; sum++; b[a[i]] = 0; for (int j = 0; j < G[i].size(); ++j) { int v = G[i][j]; if (find(v) != i && b[v]) { b[v] = 0; } } }}

这段代码实现了并查集(Union-Find)算法,用于处理图中的连通性问题。主要步骤包括:

  • 读取输入数据,构建图的邻接表
  • 初始化并查集结构
  • 找出所有未被标记的节点,并根据它们的连通性进行合并
  • 计算连通块的数量
  • 处理特定的查询请求
  • 代码采用了路径压缩和按秩合并优化技术,确保了并查集操作的高效性。

    转载地址:http://utufk.baihongyu.com/

    你可能感兴趣的文章
    LUOGU P4095 [HEOI2013]Eden 的新背包问题
    查看>>
    luogu1091合唱队形
    查看>>
    luogu1445 [violet]樱花 阶乘分解
    查看>>
    Luogu2973:[USACO10HOL]赶小猪
    查看>>
    luogu3172 [CQOI2015]选数 莫比乌斯反演+杜教筛
    查看>>
    luogu3953 [NOIp2017]逛公园 (tarjan+dijkstra+记忆化搜索)
    查看>>
    Luogu4221 WC2018州区划分(状压dp+FWT)
    查看>>
    Luogu4697 CEOI2011 Balloons 单调栈
    查看>>
    luoguP2590 [ZJOI2008]树的统计 [树链剖分] [TLE的LCT]
    查看>>
    luogu_1197 [JSOI2008]星球大战
    查看>>
    LVM2
    查看>>
    LVM: Logical Volume Manager 逻辑卷管理
    查看>>
    lvm基本知识与常用命令
    查看>>
    lvm扩容
    查看>>
    LVM逻辑卷
    查看>>
    LVM逻辑卷管理实例
    查看>>
    lvm(逻辑卷管理)的魅力(续)
    查看>>
    LVS DR 配置
    查看>>
    LVS+heartbeat 高可用LINUX服务器
    查看>>
    Lvs+keepalived 高可用性负载均衡自动化配置
    查看>>