当前位置: 首页 > news >正文

动规(24)-并查集基础题——关押罪犯

【问题描述】

S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极

不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨

气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之

间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。那么,应如何分配罪犯,才能使Z 市长看到的那个冲突事件的影响力最小?这个最小值是多少?

【输入】

输入文件名为prison.in。输入文件的每行中两个数之间用一个空格隔开。第一行为两个正整数N 和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。接下来的M 行每行为三个正整数aj,bj,cj,表示aj 号和bj 号罪犯之间存在仇恨,其怨气值为cj。数据保证1<=aj<=bj<=N,0<=cj<=1000000000,且每对罪犯组合只出现一次。

【输出】

输出文件prison.out 共1 行,为Z 市长看到的那个冲突事件的影响力。如果本年内监狱

中未发生任何冲突事件,请输出0。

【输入输出样例】

4 6

1 4 2534

2 3 3512

1 2 28351

1 3 6618

2 4 1805

3 4 12884

prison.out

3512

【输入输出样例说明】

罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件

影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。

【数据范围】

对于30%的数据有N≤15。

对于70%的数据有N≤2000,M≤50000。

对于100%的数据有N≤20000,M≤100000。

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int n, m, f[40001], vis[40001], x, y, z;
struct data
{
    int a, b, c;
} e[100001];
int comp(data a, data b)
{
    return a.c > b.c;
}
int find(int x)
{
    return f[x] == x ? x : f[x] = find(f[x]);
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
        cin >> e[i].a >> e[i].b >> e[i].c;
    for (int i = 1; i <= n; i++)
        f[i] = i;
    sort(e + 1, e + m + 1, comp);
    for (int i = 1; i <= m; i++)
    {
        x = find(e[i].a);
        y = find(e[i].b);
        if (x == y)
        {
            cout << e[i].c;
            return 0;
        }
        else
        {
            if (vis[e[i].a])
            {
                z = find(vis[e[i].a]);
                f[y] = z;
            }
            else
                vis[e[i].a] = e[i].b;

            if (vis[e[i].b])
            {
                z = find(vis[e[i].b]);
                f[x] = z;
            }
            else
                vis[e[i].b] = e[i].a;
        }
    }
    cout << 0;
    return 0;
}

相关文章:

  • 剪枝Prune
  • Mybatis是如何运用设计模式的?
  • 短视频消重去重九种方法,组合使用原创度更高,各平台轻松过原创
  • Java使用默认线程池的陷阱问题
  • Android12启动崩溃 no namespace called
  • 【HTML——旋转晕眩】(效果+代码)
  • codeblocks安装、使用、调试教程
  • 交换机与路由技术-32-命名ACL
  • 互联网大厂技术岗实习/求职经验分享(实习内推+简历+面试+offer)
  • Java中的数组以及八大排序算法
  • zabbix分布式
  • [math]判断线段是否相交及夹角
  • 如何并行化普通的python代码
  • 人力资源团队怎样利用智能科技提升工作效率
  • 对角线的输出
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【知识碎片】第三方登录弹窗效果
  • Debian下无root权限使用Python访问Oracle
  • gcc介绍及安装
  • javascript面向对象之创建对象
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • JS字符串转数字方法总结
  • laravel 用artisan创建自己的模板
  • Spark学习笔记之相关记录
  • STAR法则
  • 开源地图数据可视化库——mapnik
  • 力扣(LeetCode)21
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 时间复杂度与空间复杂度分析
  • 使用Swoole加速Laravel(正式环境中)
  • 思维导图—你不知道的JavaScript中卷
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • ${ }的特别功能
  • (4)(4.6) Triducer
  • (python)数据结构---字典
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)计算机毕业设计高校学生选课系统
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (译) 函数式 JS #1:简介
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net 反编译_.net反编译的相关问题
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • /boot 内存空间不够
  • ?
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [17]JAVAEE-HTTP协议
  • [2023-年度总结]凡是过往,皆为序章
  • [ai笔记9] openAI Sora技术文档引用文献汇总