码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【种类并查集】洛谷P1525 [NOIP2010 提高组] 关押罪犯


    P1525 [NOIP2010 提高组] 关押罪犯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

    题意:

    思路:

    要使冲突事件的影响力最小,这里可以用贪心,让影响力大的两个尽量分开即可

    那么这里可以把这么多关系按影响力从大到小排序,然后依次把已经连边的点拆开,直到发现矛盾了不能拆为止

    然后问题就变成:我们怎么去“拆”,即如何去维护两个事物的对立关系

    这里就要用到种类并查集了,又称扩展域并查集,用来维护两个事物的对立关系 

    我们先去按影响力排序,然后去遍历

    如果碰到的两个结点祖先不同,即自己指向自己或已经属于不同的监狱了,那么就用种类并查集把他们分开即可

    如果祖先相同,说明已经属于同一个监狱了,碰到了矛盾,那么停止“拆分”操作,止步于此,最大的边权就是改值

    Code:

    1. #include
    2. using namespace std;
    3. const int mxn=2e4+10,mxe=1e5+10;
    4. #define int long long
    5. int n,m;
    6. int f[mxn<<1];
    7. struct ty{
    8. int x,y,w;
    9. }a[mxe];
    10. bool cmp(ty x,ty y){
    11. return x.w>y.w;
    12. }
    13. int find(int x){
    14. return x==f[x]?x:(f[x]=find(f[x]));
    15. }
    16. void join(int u,int v){
    17. int f1=find(u),f2=find(v);
    18. if(f1!=f2) f[f1]=f2;
    19. }
    20. void init(){
    21. for(int i=0;i<=n<<1;i++) f[i]=i;
    22. }
    23. signed main(){
    24. scanf("%lld%lld",&n,&m);
    25. init();
    26. for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].w);
    27. sort(a+1,a+1+m,cmp);
    28. for(int i=1;i<=m;i++){
    29. if(find(a[i].x)==find(a[i].y)){
    30. printf("%lld\n",a[i].w);
    31. return 0;
    32. }else{
    33. join(a[i].x,a[i].y+n);
    34. join(a[i].y,a[i].x+n);
    35. }
    36. }
    37. puts("0");
    38. return 0;
    39. }

    总结:

    思维:

    1.首先是贪心的思路,求最值就考虑贪心

    算法:

    参考:(123条消息) P1525 [NOIP2010 提高组] 关押罪犯_bell041030的博客-CSDN博客

    讲的非常好

    什么时候使用种类并查集:

    维护两样事物的对立关系的时候

    当出现“两个集合”这种字眼的时候,就可以考虑种类并查集了

    写法:

    1.初始化f数组,注意原域和扩展域都要初始化

    2.确定对立关系的写法:

    join(a,b+n)

    join(b,a+n)

  • 相关阅读:
    巧用 redis 实现点赞功能,它不比 mysql 香吗?
    使用命令部署Java项目的基本步骤
    代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
    基于BP神经网络预测电力负荷(Matlab代码实现)
    Navicat平替工具,一款免费开源的通用数据库工具
    Redis基础与高可用集群架构进阶详解
    深度学习笔记
    Java 注解
    关于在 Notion 中使用 Markdown 语法
    PyTorch深度学习代码获取内存、显存使用情况
  • 原文地址:https://blog.csdn.net/weixin_62528401/article/details/126590460
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号