news 2026/6/22 10:29:37

题解:AcWing 379 捉迷藏

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
题解:AcWing 379 捉迷藏

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

AcWing:379. 捉迷藏 - AcWing题库

【题目描述】

Vani 和 cl2 在一片树林里捉迷藏。

这片树林里有N NN座房子,M MM条有向道路,组成了一张有向无环图。

树林里的树非常茂密,足以遮挡视线,但是沿着道路望去,却是视野开阔。

如果从房子A AA沿着路走下去能够到达B BB,那么在A AAB BB里的人是能够相互望见的。

现在 cl2 要在这N NN座房子里选择K KK座作为藏身点,同时 Vani 也专挑 cl2 作为藏身点的房子进去寻找,为了避免被 Vani 看见,cl2 要求这K KK个藏身点的任意两个之间都没有路径相连。

为了让 Vani 更难找到自己,cl2 想知道最多能选出多少个藏身点。

【输入】

输入数据的第一行是两个整数N NNM MM

接下来M MM行,每行两个整数x , y x,yx,y,表示一条从x xxy yy的有向道路。

【输出】

输出一个整数,表示最多能选取的藏身点个数。

【输入样例】

7 5 1 2 3 2 2 4 4 5 4 6

【输出样例】

3

【核心思想】

  1. 问题分析:给定一个包含N NN个节点M MM条边的有向无环图(DAG),需要选出最多的节点作为藏身点,使得任意两个藏身点之间都没有路径相连(即互相不可见)。这等价于求最小路径覆盖问题:用最少的不相交路径覆盖所有节点,每条路径上只能选一个节点作为藏身点。

  2. 算法选择

    • Floyd-Warshall 传递闭包:预处理图中任意两点间的可达性,将原图转化为传递闭包矩阵
    • 二分图最大匹配(匈牙利算法):将 DAG 的最小路径覆盖问题转化为二分图最大匹配问题
    • Dilworth 定理:最小路径覆盖数 = 总节点数 - 最大匹配数
  3. 关键步骤

    • 建图:读入N NN个节点和M MM条有向边,构建邻接矩阵d [ i ] [ j ] d[i][j]d[i][j]表示i ii能否直接到达j jj
    • Floyd-Warshall 求传递闭包
      • 三重循环遍历k , i , j k, i, jk,i,j
      • 更新d [ i ] [ j ] = d [ i ] [ j ] ∨ ( d [ i ] [ k ] ∧ d [ k ] [ j ] ) d[i][j] = d[i][j] \lor (d[i][k] \land d[k][j])d[i][j]=d[i][j](d[i][k]d[k][j])
      • 最终d [ i ] [ j ] d[i][j]d[i][j]表示i ii是否可以通过任意路径到达j jj
    • 构建二分图
      • 将每个节点拆分为左部和右部两个副本
      • d [ i ] [ j ] d[i][j]d[i][j]为真(i ii可达j jj),则在左部i ii和右部j jj之间连边
    • 匈牙利算法求最大匹配
      • 遍历每个左部节点i ii,尝试寻找增广路
      • 使用s t [ ] st[]st[]数组标记右部节点是否在本轮被访问过
      • 若找到匹配则匹配数r e s resres1 11
    • 计算答案:最小路径覆盖数 =N − r e s N - resNres,即最多可选的藏身点数量
  4. 时间/空间复杂度

    • 时间复杂度:O ( N 3 + N ⋅ M m a t c h ) O(N^3 + N \cdot M_{match})O(N3+NMmatch),Floyd-Warshall 为O ( N 3 ) O(N^3)O(N3),匈牙利算法为O ( N ⋅ E ) O(N \cdot E)O(NE),其中E EE为二分图边数
    • 空间复杂度:O ( N 2 ) O(N^2)O(N2),传递闭包矩阵存储
  5. 最小路径覆盖与二分图匹配的核心思想

    • 最小路径覆盖:用最少的不相交路径覆盖 DAG 中所有节点,路径之间不能有公共节点
    • Dilworth 定理:在 DAG 中,最小路径覆盖数等于总节点数减去对应二分图的最大匹配数
    • 二分图构建技巧:将每个节点拆分为左右两份,原图的可达关系转化为二分图的边
    • 匈牙利算法:通过寻找增广路不断扩大匹配,每次增广使匹配数加1 11
    • 传递闭包:Floyd-Warshall 算法预处理可达性,将间接可达转化为直接边
    • 适用于 DAG 上的路径覆盖、偏序集链划分、任务调度类问题

【算法标签】

#二分图

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;// ================= 常量与全局变量 =================constintN=205;// 最大节点数constintM=30005;// 最大边数(未使用,保留原样)intn;// 节点数量(左右部节点数相同)intm;// 边的数量boold[N][N];// 传递闭包矩阵:d[i][j] 表示 i 能否到达 j(有向边或间接可达)boolst[N];// 标记数组:记录右部顶点在当前轮匈牙利算法中是否被访问过intmatch[N];// 匹配数组:match[j] 记录右部节点 j 当前匹配的左部节点编号// ================= 匈牙利算法:尝试为左部节点 x 寻找增广路 =================// 返回值:是否成功为节点 x 找到匹配boolfind(intx){// 遍历节点 x 的所有可能右部匹配对象for(inti=1;i<=n;i++){// 如果 x 可以到达 i,且 i 在本轮搜索中还未被考虑if(d[x][i]&&!st[i]){st[i]=true;// 标记节点 i 已被本轮考虑// 情况1:节点 i 还未被匹配// 情况2:节点 i 已被匹配,但可以尝试为它的原匹配对象 match[i] 寻找新的匹配if(match[i]==0||find(match[i])){match[i]=x;// 将节点 i 匹配给节点 xreturntrue;// 成功找到匹配}}}// 尝试了所有邻接点都失败,返回 falsereturnfalse;}// ================= 主函数 =================intmain(){// 读取节点数和边数cin>>n>>m;// 读入 m 条有向边while(m--){inta,b;cin>>a>>b;d[a][b]=true;// 标记 a 可以直接到达 b}// Floyd-Warshall 算法求传递闭包// d[i][j] 最终表示 i 是否能通过任意路径到达 jfor(intk=1;k<=n;k++)for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)d[i][j]|=d[i][k]&d[k][j];// ========= 匈牙利算法求最大匹配 =========intres=0;// 记录最大匹配数// 为每个左部节点尝试寻找匹配for(inti=1;i<=n;i++){memset(st,false,sizeof(st));// 每轮搜索前重置标记数组if(find(i))// 如果成功找到匹配res++;// 匹配数加 1}// 输出结果:最小路径覆盖数 = 总节点数 - 最大匹配数cout<<n-res<<endl;return0;}

【运行结果】

7 5 1 2 3 2 2 4 4 5 4 6 3
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 10:25:23

BAGEL基准:构建高质量垂直领域评估数据集的技术实践

1. 项目概述&#xff1a;为什么我们需要BAGEL基准&#xff1f;在人工智能&#xff0c;特别是大语言模型&#xff08;LLM&#xff09;评估领域&#xff0c;我们正面临一个日益凸显的困境&#xff1a;模型在通用基准测试&#xff08;如MMLU、C-Eval&#xff09;上的分数越来越高&…

作者头像 李华
网站建设 2026/6/22 10:21:59

ZeroTier One实战:用SDN思想搭建跨网络二层虚拟局域网

1. 项目概述&#xff1a;从零搭建一个可落地的虚拟局域网&#xff0c;不是“翻墙”&#xff0c;而是真正解决远程办公、多设备协同与边缘网络管理的实操路径“Getting Started with Software-Defined Networking and Creating a VPN with ZeroTier One”——这个标题乍看像教科…

作者头像 李华
网站建设 2026/6/22 10:21:27

AI应用版本更新的技术解析与工程实践

我无法基于“豆包App版本更新”这一标题生成符合要求的博文。原因如下&#xff1a;输入内容中完全缺失项目正文、关键词列表、摘要描述等核心参数&#xff0c;仅提供了一个模糊的营销式标题和空置的热搜词字段&#xff08;“最新网络热词&#xff1a;”后无任何内容&#xff09…

作者头像 李华
网站建设 2026/6/22 10:15:53

puzzle(1017)马赛克

马赛克规则&#xff1a;每个数字表示自身八邻居构成的九宫格内黑格子的数量&#xff0c;确定所有的格子是黑格子还是白格子。PS&#xff1a;初始只有若干个数字&#xff0c;所有格子都是未知格子&#xff0c;黑格子总数也是未知的。3*35*510*1015*1525*2550*50

作者头像 李华
网站建设 2026/6/22 10:12:35

[智能体-493]:Coze 工作流:图文生成视频完整流程拆解

这是一套从主题输入→生成绘图提示词→生成参考图→生成分镜脚本→生成动态视频的线性自动化工作流&#xff0c;共 5 个节点串联执行&#xff0c;全程无分支&#xff0c;顺序执行。一、节点顺序与数据流转总览流程链路&#xff1a; 开始 → 图片提示词大模型节点 → 图像生成节…

作者头像 李华
网站建设 2026/6/22 10:08:17

Moonlight TV终极指南:3步将LG电视变身高性能游戏大屏

Moonlight TV终极指南&#xff1a;3步将LG电视变身高性能游戏大屏 【免费下载链接】moonlight-tv Lightweight NVIDIA GameStream Client, for LG webOS TV and embedded devices like Raspberry Pi 项目地址: https://gitcode.com/gh_mirrors/mo/moonlight-tv Moonligh…

作者头像 李华