博客
关于我
POJ 1703 Find them, Catch them
阅读量:803 次
发布时间:2023-03-03

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

这道题的关键在于利用并查集数据结构来处理动态的合并和查找操作。类型D的消息会给出两个人的组是不同的,这需要用并查集来合并他们的关系,并记录他们的敌人关系。类型A的消息则需要根据当前的状态来判断两个人的组是否相同。

并查集的实现:

  • 父节点数组(F):用于记录每个节点的父节点,路径压缩可以使查找操作更高效。
  • 敌人数组(E):用于记录每个节点的敌人,初始为0,表示无敌人。
  • 处理消息逻辑:

    • 类型D [a] [b]:当处理这条消息时,找到a和b的当前根。如果其中一个的敌人已经被设置,则将敌人的关系合并,并更新父节点。同时,标记a和b的敌人关系。
    • 类型A [a] [b]:查找a和b的当前根。如果根相同,说明在同一组。如果根不同,检查他们的敌人是否在同一组。如果敌人组不同,则说明在不同的组;否则,无法确定。

    代码实现:

    #include 
    #include
    #define REP(i, s, n) for(int i = s; i <= n; i++)#define MAX_N 100000 + 10using namespace std;int find(int x) { if(F[x] == x) return x; return F[x] = find(F[x]);}void Union(int x, int y) { x = find(x); y = find(y); if(x == y) return; F[y] = x;}int main() { int T; scanf("%d", &T); while(T-- > 0) { int n, q; scanf("%d %d", &n, &q); F = new int[MAX_N]; E = new int[MAX_N]; for(int i=1; i<=n; i++) { F[i] = i; E[i] = 0; } for(int i=1; i<=n; i++) E[i] = 0; while(q--) { char s[3]; scanf("%s", s); if(s[0] == 'D') { int x, y; scanf("%d %d", &x, &y); if(E[x] == 0 && E[y] == 0) { E[x] = y; E[y] = x; } else if(E[x] == 0) { E[x] = y; Union(x, E[y]); } else if(E[y] == 0) { E[y] = x; Union(y, E[x]); } else if(E[x] != 0 && E[y] != 0) { if(E[x] == E[y]) { Union(x, E[x]); Union(y, E[y]); } else { Union(x, E[y]); Union(y, E[x]); } } } else if(s[0] == 'A') { int x, y; scanf("%d %d", &x, &y); int fx = find(x); int fy = find(y); if(fx == fy) { printf("In the same gang.\n"); } else if(E[fx] == E[fy]) { printf("In different gangs.\n"); } else { printf("Not sure yet.\n"); } } } } return 0;}

    解释:

    • 初始化:每个节点的父节点指向自己,敌人数组初始化为空。
    • 类型D处理:将两个节点的敌人关系合并,并更新父节点,使其在同一组。
    • 类型A处理:根据当前的父节点和敌人关系判断两个节点的组是否相同。

    这种方法确保了在处理大量查询时的高效性,适合题目给定的约束条件。

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

    你可能感兴趣的文章
    PowerPC-object与elf中的符号引用
    查看>>
    QFileSystemModel
    查看>>
    Powershell DSC 5.0 - 参数,证书加密账号,以及安装顺序
    查看>>
    PowerShell 批量签入SharePoint Document Library中的文件
    查看>>
    Powershell 自定义对象小技巧
    查看>>
    pytorch从预训练权重加载完全相同的层
    查看>>
    PowerShell~发布你的mvc网站
    查看>>
    PowerShell使用详解
    查看>>
    Powershell制作Windows安装U盘
    查看>>
    powershell命令
    查看>>
    PO、VO、DAO、BO、DTO、POJO能分清吗?
    查看>>
    PP-PLL:基于概率传播的部分标签学习
    查看>>
    pytorch介绍
    查看>>
    pprint 排序字典但不是集合?
    查看>>
    pptp拨号上网
    查看>>
    ppt上的倒计时小工具_PPT中有哪些「看似很 LOW,实则惊艳」的小工具
    查看>>
    PPT添加视频的路径问题
    查看>>
    PPT美化插件 islide 安装过程问题“加载com加载项时运行出现错误”
    查看>>
    Prefix Tuning:详细解读Optimizing Continuous Prompts for Generation
    查看>>
    PreparedStatement 与Statement 的区别,以及为什么推荐使用 PreparedStatement ?
    查看>>