【NOIP提高组】 关押罪犯

【NOIP提高组】 关押罪犯

      • C语言
      • C++语言实现
      • Python语言实现


💐The Begin💐点点关注,收藏不迷路💐

S城现有两座监狱,一共关押着N名罪犯,编号分别为1-N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S城Z市长那里。公务繁忙的Z市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。

在详细考察了N名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。那么,应如何分配罪犯,才能使Z市长看到的那个冲突事件的影响力最小?这个最小值是多少?

输入

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

输出

输出共1行,为Z市长看到的那个冲突事件的影响力。如果本年内监狱中未发生任何冲突事件,请输出0。

样例输入

4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884

样例输出

3512

提示

【输入输出样例说明】罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。
在这里插入图片描述

【数据范围】对于30%的数据有N≤ 15。对于70%的数据有N≤ 2000,M≤ 50000。对于100%的数据有N≤ 20000,M≤ 100000。

C语言

#include <stdio.h>
#include <stdlib.h>

// 定义最大节点数和最大边数
#define MAX_N 20005
#define MAX_M 100005

// 结构体表示边的信息,包含两个端点和边的权重(怨气值)
typedef struct {
    int a;
    int b;
    int c;
} Edge;

// 比较函数,用于qsort按照边的权重(怨气值)从大到小排序
int compare(const void *p1, const void *p2) {
    const Edge *edge1 = (const Edge *)p1;
    const Edge *edge2 = (const Edge *)p2;
    return edge2->c - edge1->c;
}

// 查找并返回节点x所在集合的代表元素(根)
int find(int x, int fa[]) {
    if (fa[x] == x) {
        return x;
    } else {
        return fa[x] = find(fa[x], fa);
    }
}

// 读取一个整数
int read() {
    int x = 0;
    int f = 1;
    char ch = getchar();

    // 跳过非数字字符,处理正负号
    while (ch < '0' || ch > '9') {
        if (ch == '-') {
            f = -1;
        }
        ch = getchar();
    }

    // 读取数字字符并转换为整数
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + (ch - '0');
        ch = getchar();
    }

    return x * f;
}

int main() {
    int n;  // 罪犯的数量
    int m;  // 存在仇恨的罪犯对数
    Edge e[MAX_M];  // 存储边的信息数组
    int fa[2 * MAX_N];  // 并查集数组,用于存储每个节点的父节点

    // 读取罪犯数量和存在仇恨的罪犯对数
    n = read();
    m = read();

    // 读取每条边的两个端点和边的权重(怨气值)
    for (int i = 1; i <= m; i++) {
        e[i].a = read();
        e[i].b = read();
        e[i].c = read();
    }

    // 初始化并查集数组,每个节点的父节点初始化为自身
    for (int i = 1; i <= 2 * n; i++) {
        fa[i] = i;
    }

    // 使用qsort对边按照权重(怨气值)从大到小排序
    qsort(e + 1, m, sizeof(Edge), compare);

    // 遍历排序后的边,尝试将罪犯分配到不同集合(监狱)
    for (int i = 1; i <= m; i++) {
        int x = find(e[i].a, fa);
        int y = find(e[i].b, fa);

        if (x == y) {
            // 如果两个端点所在集合相同,说明会发生冲突,输出当前边的权重(最小冲突影响力)
            printf("%d", e[i].c);
            return 0;
        }

        // 将两个端点所在集合分别与对方集合的补集合并
        fa[y] = find(e[i].a + n, fa);
        fa[x] = find(e[i].b + n, fa);
    }

    // 如果所有边都处理完没有发现冲突,输出0
    printf("0");

    return 0;
}

C++语言实现

#include <iostream>
#include <algorithm>

// 定义最大节点数和最大边数
const int MAX_N = 20005;
const int MAX_M = 100005;

// 结构体表示边的信息,包含两个端点和边的权重(怨气值)
struct Edge {
    int a;
    int b;
    int c;
};

// 比较函数,用于按照边的权重(怨气值)从大到小排序
bool cmp(const Edge& p1, const Edge& p2) {
    return p1.c > p2.c;
}

// 查找并返回节点x所在集合的代表元素(根)
int find(int x, int fa[]) {
    if (fa[x] == x) {
        return x;
    } else {
        return fa[x] = find(fa[x], fa);
    }
}

int main() {
    int n;  // 罪犯的数量
    int m;  // 存在仇恨的罪犯对数
    Edge e[MAX_M];  // 存储边的信息数组
    int fa[2 * MAX_N];  // 并查集数组,用于存储每个节点的父节点

    // 读取罪犯数量和存在仇恨的罪犯对数
    std::cin >> n;
    std::cin >> m;

    // 读取每条边的两个端点和边的权重(怨气值)
    for (int i = 1; i <= m; i++) {
        std::cin >> e[i].a;
        std::cin >> e[i].b;
        std::cin >> e[i].c;
    }

    // 初始化并查集数组,每个节点的父节点初始化为自身
    for (int i = 1; i <= 2 * n; i++) {
        fa[i] = i;
    }

    // 对边按照权重(怨气值)从大到小排序
    std::sort(e + 1, e + m + 1, cmp);

    // 遍历排序后的边,尝试将罪犯分配到不同集合(监狱)
    for (int i = 1; i <= m; i++) {
    int x = find(e[i].a, fa);
    int y = find(e[i].b, fa);

        if (x == y) {
            // 如果两个端点所在集合相同,说明会发生冲突,输出当前边的权重(最小冲突影响力)
            std::cout << e[i].c << std::endl;
            return 0;
        }

        // 将两个端点所在集合分别与对方集合的补集合并
        fa[y] = find(e[i].a + n, fa);
        fa[x] = find(e[i].b + n, fa);
    }

    // 如果所有边都处理完没有发现冲突,输出0
    std::cout << "0" << std::endl;

    return 0;
}

Python语言实现

MAX_N = 20005
MAX_M = 100005


def find(x, fa):
    if fa[x] == x:
        return x
    return find(fa[x], fa)


n, m = map(int, input().split())  # 读取罪犯数量和存在仇恨的罪犯对数
e = []  # 存储边的信息列表

# 读取每条边的两个端点和边的权重(怨气值)
for _ in range(m):
    a, b, c = map(int, input().split())
    e.append((a, b, c))

fa = list(range(2 * MAX_N))  # 初始化并查集列表,每个节点的父节点初始化为自身

# 对边按照权重(怨气值)从大到小排序
e.sort(key=lambda x: x[2], reverse=True)

# 遍历排序后的边,尝试将罪犯分配到不同集合(监狱)
for i in range(m):
    x = find(e[i][0], fa)
    y = find(e[i][1], fa)

    if x == y:
        # 如果两个端点所在集合相同,说明会发生冲突,输出当前边的权重(最小冲突影响力)
        print(e[i][2])
        break

    # 将两个端点所在集合分别与对方集合的补集合并
    fa[y] = find(e[i][0] + MAX_N, fa)
    fa[x] = find(e[i][1] + MAX_N, fa)
else:
    # 如果所有边都处理完没有发现冲突,输出0
    print("0")

在这里插入图片描述


💐The End💐点点关注,收藏不迷路💐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/903994.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chrome和Firefox哪款浏览器的密码管理更安全

在当今数字化时代&#xff0c;浏览器已成为我们日常生活中不可或缺的工具。其中&#xff0c;谷歌Chrome和Mozilla Firefox是两款广受欢迎的浏览器。除了浏览网页外&#xff0c;它们还提供了密码管理功能&#xff0c;帮助用户保存和管理登录凭证。然而&#xff0c;关于哪款浏览器…

预览 PDF 文档

引言 在现代Web应用中&#xff0c;文件预览功能是非常常见的需求之一。特别是在企业级应用中&#xff0c;用户经常需要查看各种类型的文件&#xff0c;如 PDF、Word、Excel 等。本文将详细介绍如何在Vue项目中实现 PDF 文档的预览功能。 实现原理 后端API 后端需要提供一个…

web前端多媒体标签设置(图片,视频,音频)以及图片热区(usemap)的设置

多媒体标签运用 在HTML中有以下常见多媒体标签&#xff1a; <img> &#xff08;图像标签&#xff09; - 作用&#xff1a;用于在网页中嵌入图像。 - 示例&#xff1a; <img src"image.jpg" alt"这是一张图片"> 。其中 src 属性指定图像的…

结合无监督表示学习与伪标签监督的自蒸馏方法,用于稀有疾病影像表型分类的分散感知失衡校正|文献速递-基于生成模型的数据增强与疾病监测应用

Title 题目 Hybrid unsupervised representation learning and pseudo-label supervisedself-distillation for rare disease imaging phenotype classification with dispersion-aware imbalance correction 结合无监督表示学习与伪标签监督的自蒸馏方法&#xff0c;用于稀…

【C++】入门C++

1.C的第一个程序 之前写的C语言文件都是后缀为.c的文件&#xff0c;进入C后就要把后缀改为.c了&#xff0c;vs编译器看到是.cpp就会调⽤C编译器编译。C兼容C语言的绝大多数语法&#xff0c;所以C语言的 hallo word 依旧可以在C下使用。 //test.cpp //c语言的hallo world #inc…

紫光同创——盘古 50KN 网口板

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 一、开发系统介绍 盘古 50KN 网口板开发板&#xff08;MES50H-Ethernet&#xff09;采用了核心板扩展板的结 构&#…

本篇文章来介绍下dockerfile

我开始玩儿docker的时候&#xff0c;都是通过docker pull命令把基础镜像拉取到本地&#xff0c;然后在跑成容器&#xff0c;在操作容器&#xff0c;做一些自己的事情&#xff0c;比如安装个java环境什么的&#xff0c;直到我接触到了dockerfile&#xff0c;我发现dockerfile真是…

一款基于.NET8开源且免费的中小型酒店管理系统

项目介绍 TopskyHotelManagerSystem是一款基于.NET8开源、免费&#xff08;MIT License&#xff09;的中小型酒店管理系统&#xff0c;为中小型酒店提供全面的酒店管理系统解决方案&#xff0c;帮助酒店提高运营效率&#xff0c;优化客户体验。 开发目的 在现如今发展迅速的酒…

【本科毕业设计】基于单片机的智能家居防火防盗报警系统

基于单片机的智能家居防火防盗报警系统 源码下载摘要Abstract第1章 绪论1.1课题的背景1.2 研究的目的和意义 第2章 系统总体方案设计2.1 设计要求2.2 方案选择和论证2.2.1 单片机的选择2.2.2 显示方案的选择 第3章 系统硬件设计3.1 整体方案设计3.1.1 系统概述3.1.2 系统框图 3…

【测试平台】打包 子节点ios环境配置

主要记录如何配置ios打包机环境&#xff0c;ios环境相对来说比较简单的&#xff0c;研发配置好证书可以本地打包&#xff0c;接入流程比较简单了。 打包机系统升级 1.升级mac OS系统 一般升级好几个小时&#xff0c;可以晚上下载好 2.下载xcode并安装 Appstroe 下载安装xco…

分布式光伏是什么意思?如何高效管理?

分布式光伏系统是指在用户现场或靠近用电现场配置较小的光伏发电供电系统&#xff0c;以满足特定用户的需求。根据通知&#xff0c;分布式光伏系统主要有以下几类定义&#xff1a; 10kV以下电压等级接入&#xff0c;且单个并网点总装机容量不超过6MW的分布式电源&#xff1a;这…

初识WebGL

思路&#xff1a; 构建<canvas>画布节点&#xff0c;获取其的实例。使用getWebGLContext() 拿到画布上下文。拿到上下文用clearColor() 设置背景颜色。最后清空canvas画布,是为了清除颜色缓冲区。 html结构&#xff1a; <!DOCTYPE html> <html lang"en&…

微信小程序时间弹窗——年月日时分

需求 1、默认当前时间2、选择时间弹窗限制最大值、最小值3、每次弹起更新最大值为当前时间&#xff0c;默认值为上次选中时间4、 minDate: new Date(2023, 10, 1).getTime(),也可以传入时间字符串new Date(2023-10-1 12:22).getTime() html <view class"flex bb ptb…

redis部署手册

文章目录 一、 环境配置资源配置操作系统资源配置服务器1服务器2服务器3 目录规划 二、Redis软件部署2.1 上传相关软件包2.2 安装软件2.3 修改配置文件2.3.1 修改redis.conf2.3.2 修改sentinel.conf2.3.3 启动2.3.4 安装完成 三、Redis的哨兵恢复3.1 现象3.2 解决方法 一、 环境…

SD-WAN分布式组网:构建高效、灵活的企业网络架构

随着企业数字化转型的深入&#xff0c;分布式组网逐渐成为企业网络架构中的核心需求。无论是跨区域的分支机构互联&#xff0c;还是企业与云服务的连接&#xff0c;如何在不同区域实现高效、低延迟的网络传输&#xff0c;已成为业务成功的关键。SD-WAN&#xff08;软件定义广域…

#PCIE#基础知识分解之 CC/SRNS/SRIS 时钟架构

参考资料为PCIe Base Spec和CEM Spec。 1.1 时钟架构分类 PCIe参考时钟的三种架构&#xff1a; Common Refclk (Shared Refclk) ArchitectureData Clocked Rx ArchitectureSeparate Refclk Architecture 下面&#xff0c;我们来简单地聊一聊前面说到的三种参考时钟架构&…

开源一款前后端分离的企业级网站内容管理系统,支持站群管理、多平台静态化,多语言、全文检索的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一款前后端分离的企业级网站内容管理系统&#xff0c;支持站群管理、多平台静态化&#xff0c;多语言、全文检索的源码。 前言 在当今的数字化时代&#xff0c;企业网站和个人博客已成为信息传播和品牌建设的重要渠道。…

Linux系统基础-多线程超详细讲解(2)_线程控制

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-多线程超详细讲解(2)_线程控制 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f4…

「C/C++」C/C++ 之 判断语句

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

2024年10月HarmonyOS应用开发者基础认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同 这是基础认证题库&#xff0c;不是高级认证题库注意看清楚标题 高级认证题库地址&#xff1a;20…