二分图——AcWing 257. 关押罪犯

目录

二分图

定义

运用情况

注意事项

解题思路

AcWing 257. 关押罪犯

题目描述

运行代码

代码思路

改进思路

二分图

定义

二分图(Bipartite Graph)是一种特殊的图,在这种图中,顶点可以被分成两个互不相交的集合(设为集合X和Y),并且图中的每一条边都连接一个X集合中的顶点和Y集合中的顶点,没有边连接X集合内的两个顶点,也没有边连接Y集合内的两个顶点。

更形式化地,如果一个无向图G=(V,E),其中V可以被分割成两个子集V1和V2,满足:

  • V = V1 ∪ V2
  • V1 ∩ V2 = ∅
  • 每条边e ∈ E都是在V1和V2之间,即对于任意边(u,v) ∈ E,都有u ∈ V1且v ∈ V2或者u ∈ V2且v ∈ V1。

运用情况

  1. 匹配问题:如工作分配问题,一边是工人,另一边是工作,边表示工人能做对应的工作。最大匹配问题可以使用匈牙利算法解决。
  2. 调度问题:比如课程安排问题,一边是时间槽,另一边是课程,边表示课程可以在这个时间槽上安排。
  3. 推荐系统:用户和商品可以构成二分图,边表示用户对商品的兴趣程度。
  4. 社交网络分析:如用户与他们喜欢的音乐、电影等之间的关系。
  5. 化学结构:分子结构可以被视为二分图,其中原子和键交替排列。

注意事项

  1. 识别二分图:可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来判断一个图是否是二分图,同时划分出两个顶点集合。
  2. 染色法:如果一个图能够用两种颜色给所有顶点着色,使得任何相邻的两个顶点颜色不同,则这个图是二分图。
  3. 奇数环检测:若图中存在奇数长度的环,则该图不是二分图,因为无法用两种颜色正确着色。

解题思路

  1. 二分图判定:使用BFS或DFS进行遍历,为每个顶点着色并检查是否有冲突。
  2. 最大匹配:使用匈牙利算法或增广路径算法寻找最大匹配。
  3. 最小覆盖:Konig定理指出在二分图中,最小顶点覆盖等于最大匹配的大小。
  4. 稳定婚姻问题:如 Gale-Shapley 算法用于解决二分图上的配对问题。

AcWing 257. 关押罪犯

题目描述

257. 关押罪犯 - AcWing题库

运行代码

#include <iostream>
#include <cstring>using namespace std;const int N = 20010, M = 200010;int n, m;
int h[N], e[M], ne[M], w[M], idx;
int color[N];void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}bool dfs(int u, int c, int mid)
{color[u] = c;bool valid = true;  // 添加剪枝标志for (int i = h[u]; ~i && valid; i = ne[i])  // 增加剪枝条件{int j = e[i];if (w[i] <= mid) continue;if (color[j]){if (color[j] == c) {valid = false;  // 标记不合法break;}}else if (!dfs(j, 3 - c, mid)) {valid = false;  // 标记不合法break;}}return valid;
}bool check(int mid)
{memset(color, 0, sizeof color);bool foundInvalid = false;  // 标记是否找到不合法情况for (int i = 1; i <= n &&!foundInvalid; i++)  // 增加剪枝条件{if (!color[i]){if (!dfs(i, 1, mid)){foundInvalid = true;  // 标记找到不合法break;}}}return!foundInvalid;
}int main()
{memset(h, -1, sizeof h);cin >> n >> m;while (m--){int a, b, w;if (!(cin >> a >> b >> w))  // 输入错误处理{cerr << "Invalid input. Please enter valid integers." << endl;return 1;}add(a, b, w);add(b, a, w);}int l = 0, r = 1e9;while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;else l = mid + 1;}cout << l << endl;return 0;
}

代码思路

  1. 图的表示:使用邻接表(hene 数组)来表示图,其中 h[u] 存储与节点 u 相连的第一条边的索引。

  2. 添加边add 函数用于向图中添加有向边及其权重 c。注意,由于图是无向的,因此对于每条无向边,会添加两条有向边。

  3. 深度优先搜索 (DFS)dfs 函数执行深度优先搜索从给定节点 u 开始,并给节点分配颜色(1 或 2),以检查图是否为二分图。如果出现冲突,则返回 false

  4. 检查函数check 函数对所有未着色的节点执行 DFS,并返回布尔值,指示整个图在给定阈值权重 mid 下是否为二分图。

  5. 二分查找:主循环使用二分查找来找到使图不再是二分图的最小阈值权重(l)。

  6. 输入与输出:程序读取节点数量 n 和边的数量 m,然后读取每条边及其权重,最后输出找到的阈值权重。

改进思路

  1. 检查函数的早期终止:当前的 check 函数使用一个标志 foundInvalid 来提前终止,一旦发现图不是二分图则停止计算。这可以提升性能,避免不必要的计算。

  2. 权重比较优化:在 dfs 函数中,权重小于等于 mid 的边被忽略。这样减少了探索的边的数量。

  3. 内存管理:使用邻接表而不是邻接矩阵表示图,尤其对于稀疏图来说,这种方法更加高效。

  4. 输入验证:在读取边时,代码检查无效输入,防止因意外输入导致运行时错误。

  5. 细化二分查找:确保二分查找空间被正确设置,且循环中的查找条件能够准确找到正确的阈值。
  6. 边缘情况处理:检查边缘情况,如空图或没有边的图,以避免不必要的计算。
  7. 错误处理:改进错误处理,提供更详细的错误信息,或优雅地处理错误。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第233题数字1的个数

题目&#xff1a; 题解&#xff1a; int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 klong long mulk 1;int ans 0;f…

硬盘HDD:AI时代的战略金矿?

在这个AI如火如荼的时代&#xff0c;你可能以为硬盘HDD已经像那些过时的诺基亚手机一样&#xff0c;被闪存和云存储淘汰到历史的尘埃里。但&#xff0c;别急着给HDD们举行退休派对&#xff0c;因为根据Finis Conner这位硬盘界的传奇人物的说法&#xff0c;它们非但没退场&#…

MATLAB算法实战应用案例精讲-【数模应用】Lasso回归(套索回归)(附MATLAB、R语言和Python代码实现)

目录 知识储备 拟合 (一): 过拟合与欠拟合 (二): 常用解决办法 几个高频面试题目 岭回归与套索回归的比较: 5种常见回归类型及属性 算法原理 为什么要用LASSO套索回归? 应用场景 与普通最小二乘法的区别 数学模型 lasso回归 - 梯度下降(在线性回归后加上L1正则项…

Linux进程——子进程详解

文章目录 查看进程的另一种方式如何创建子进程fork函数详解fork函数的用法fork函数做了什么为什么fork有两个返回值父子进程的运行顺序是什么样的为什么fork函数的两个返回值不同 在上一节中我们简单介绍了进程的概念&#xff0c;还有父进程和子进程 这篇文章的主要内容是介绍…

eNsp公司管理的网络NAT策略搭建

实验拓扑图 实验需求&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9&#xff0c;多出口环境基于带…

护网HW面试——redis利用方式即复现

参考&#xff1a;https://xz.aliyun.com/t/13071 面试中经常会问到ssrf的打法&#xff0c;讲到ssrf那么就会讲到配合打内网的redis&#xff0c;本篇就介绍redis的打法。 未授权 原理&#xff1a; Redis默认情况下&#xff0c;会绑定在0.0.0.0:6379&#xff0c;如果没有采用相关…

暴雨让服务器不怕热҈热҈热҈热҈

在AI算力呈几何倍数增长的趋势下&#xff0c;算力逐渐朝着“高性能、高密度、高耗能“发展。在高耗能的算力下&#xff0c;AI服务器功率已逐步逼近风冷散热极限&#xff0c;而液冷作为更加高效、低能耗的制冷技术&#xff0c;逐渐成为了高密度算力散热场景的首选方案。 液冷的…

网络安全----防御----防火墙nat以及智能选路

前面要求在前一篇博客 网络安全----防御----防火墙安全策略组网-CSDN博客 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的ht…

Jenkins中Node节点与构建任务

目录 节点在 Jenkins 中的主要作用 1. 分布式构建 分布式处理 负载均衡 2. 提供不同的运行环境 多平台支持 特殊环境需求 3. 提高资源利用率 动态资源管理 云端集成 4. 提供隔离和安全性 任务隔离 权限控制 5. 提高可扩展性 横向扩展 高可用性 Jenkins 主服务…

Python excel知识库批量模糊匹配的3种方法实例(fuzzywuzzy\Gensim)

前言 当然&#xff0c;基于排序的模糊匹配&#xff08;类似于Excel的VLOOKUP函数的模糊匹配模式&#xff09;也属于模糊匹配的范畴&#xff0c;但那种过于简单&#xff0c;不是本文讨论的范畴。 本文主要讨论的是以公司名称或地址为主的字符串的模糊匹配。 使用编辑距离算法进…

ffmpeg 时间相关--时间基,timebase,pts,dts,duration

在编码时 video 的情况如下&#xff1a; 1. 在 yuv 数据 阶段&#xff0c;和时间相关参数如下&#xff1a; yuv数据我们在设置的时候要 设置参数&#xff0c;其中和时间相关的是 yuvfps 和 timebase&#xff0c;yuvfps一般是每秒25帧&#xff0c;yuvfps25&#xff1b;timebas…

Is Temperature the Creativity Parameter of Large Language Models?阅读笔记

最近有小伙伴来问LLM的参数该如何设计&#xff0c;废话不多说来看看paper吧。首先&#xff0c;常见的可以进行调参的几个值有temperature&#xff0c;top-p和top-k。今天这篇文章是关于temperature的。 原文链接&#xff1a;https://arxiv.org/abs/2405.00492 temperature如果…

OSPF.中DBD数据包

指定路由器---DR的身份 备份指定路由器---BDR的身份&#xff08;RID&#xff09;注意在一个广播域中的所有设备DR和BDR的认知必须统一。 只有DR和BDR会监听224.0.0.6的组播地址 会发出多个数据包 作用&#xff1a; 1.用来主从选举&#xff08;没有携带lsa再要信息的DBD报文…

《斯科特·凯尔比的风光摄影手册》读书笔记

写在前面 《斯科特凯尔比的风光摄影手册》读书笔记整理没有全部读完&#xff0c;选择了感兴趣的章节理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真做完事情&#xff0c;…

PHP使用,按时间水平分表,跨月多表条件查询数据分页显示

1.创建测试表并添加一些对应数据 sh_user_visit_202405 uid,create_time sh_user_visit_202406 uid,create_time sh_user_visit_202407 uid,create_time2.格式化表 //获取表数组 public function getListByCross($table_prefix, $start_date, $end_date){if($end_date > d…

nginx+lua 实现URL重定向(根据传入的参数条件)

程序版本说明 程序版本URLnginx1.27.0https://nginx.org/download/nginx-1.27.0.tar.gzngx_devel_kitv0.3.3https://github.com/simpl/ngx_devel_kit/archive/v0.3.3.tar.gzluajitv2.1https://github.com/openresty/luajit2/archive/refs/tags/v2.1-20240626.tar.gzlua-nginx-m…

Qt项目:基于Qt实现的网络聊天室---TCP服务器和token验证

文章目录 TCP服务器设计客户端TCP管理者ChatServerAsioIOServicePoolSession层LogicSystem总结 token验证模块完善protoStatusServer验证token客户端处理登陆回包用户管理登陆界面 本篇完成的模块是TCP服务器的设计和token验证 TCP服务器设计 客户端TCP管理者 因为聊天服务要…

游戏服务端设计:任务系统

任务系统的设计 导读 在众多的游戏系统当中,任务系统可谓是缺一不可。它是策划对游戏周期的一种抽象拆分。每个阶段的任务设定和游戏的进度密切相关,可以视其为带有目标的玩法提示和指引。通过完成任务,来了解游戏背景、熟悉玩法,或者是达到某种目标(等级提升/道具获取/条…

C#开发翻译较好的API

用于翻译服务的网站或API&#xff0c;尤其适合C#开发&#xff0c;以下是一些知名的选项&#xff1a; Google Cloud Translation API Google 提供的翻译服务非常强大&#xff0c;支持多种语言&#xff0c;而且有很好的文档和社区支持。您可以使用C# SDK来调用此API。 Microsoft …

LabVIEW心电信号自动测试系统

开发了一种基于LabVIEW的心电信号自动测试系统&#xff0c;通过LabVIEW开发的上位机软件&#xff0c;实现对心电信号的实时采集、分析和自动化测试。系统包括心电信号采集模块、信号处理模块和自动化测试模块&#xff0c;能够高效、准确地完成心电信号的测量与分析。 硬件系统…