题解:AcWing 395 冗余路径
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。欢迎大家订阅我的专栏算法题解C与Python实现附上汇总贴算法竞赛备考冲刺必刷题C | 汇总【题目来源】AcWing395. 冗余路径 - AcWing题库【题目描述】为了从F FF个草场中的一个走到另一个奶牛们有时不得不路过一些她们讨厌的可怕的树。奶牛们已经厌倦了被迫走某一条路所以她们想建一些新路使每一对草场之间都会至少有两条相互分离的路径这样她们就有多一些选择。每对草场之间已经有至少一条路径。给出所有R RR条双向路的描述每条路连接了两个不同的草场请计算最少的新建道路的数量路径由若干道路首尾相连而成。两条路径相互分离是指两条路径没有一条重合的道路。但是两条分离的路径上可以有一些相同的草场。可能有不止一条道路直接连接同一对草场尽管如此你仍可以在它们之间再建一条道路作为另一条不同的道路。【输入】第1 11行输入F FF和R RR。接下来R RR行每行输入两个整数表示两个草场它们之间有一条道路。【输出】输出一个整数表示最少的需要新建的道路数。【输入样例】7 7 1 2 2 3 3 4 2 5 4 5 5 6 5 7【输出样例】2【核心思想】问题分析给定无向连通图要求添加最少的新边使得任意两点之间至少有两条边不相交的路径。这等价于使图变为边双连通图不存在桥。关键在于理解桥是限制边双连通性的唯一障碍只要消除所有桥图就变为边双连通。算法选择Tarjan算法求桥使用l o w lowlow数组和d f n dfndfn数组找出所有桥边边双连通分量分解将图分解为若干个边双连通分量去掉桥后的连通块缩点建树将每个边双连通分量缩成一个点桥作为边构建一棵树叶子节点配对统计缩点树中的叶子节点数答案为( l e a f 1 ) / 2 (leaf 1) / 2(leaf1)/2关键步骤Step 1 - Tarjan求桥DFS遍历图维护d f n [ x ] dfn[x]dfn[x]时间戳和l o w [ x ] low[x]low[x]能通过回边到达的最小时间戳对于边( x , y ) (x, y)(x,y)若l o w [ y ] d f n [ x ] low[y] dfn[x]low[y]dfn[x]则该边是桥使用异或技巧i ^ 1处理双向边避免重复访问Step 2 - 边双连通分量分解使用栈记录当前DFS路径上的节点当d f n [ x ] l o w [ x ] dfn[x] low[x]dfn[x]low[x]时找到边双连通分量的根弹出栈中节点直到x xx这些节点构成一个边双连通分量Step 3 - 缩点建树每个边双连通分量缩成一个点桥边连接不同的分量形成一棵树Step 4 - 统计叶子节点遍历所有桥边统计每个分量在缩点树中的度数度数为1的分量是叶子节点Step 5 - 计算答案设叶子节点数为c n t cntcnt答案为( c n t 1 ) / 2 (cnt 1) / 2(cnt1)/2即把叶子两两配对需要的边数时间/空间复杂度时间复杂度O ( F R ) O(F R)O(FR)Tarjan算法和后续处理均为线性时间空间复杂度O ( F R ) O(F R)O(FR)存储图和各种辅助数组边双连通分量与桥的核心思想桥的定义删除后会使图不连通的边是边双连通性的瓶颈边双连通分量不含桥的最大连通子图分量内任意两点有两条边不相交路径缩点树的性质将边双连通分量缩点后桥形成一棵树叶子节点代表边缘分量最优加边策略在缩点树中连接两个叶子节点可以同时减少两个叶子的度数答案公式( l e a f 1 ) / 2 (leaf 1) / 2(leaf1)/2表示将l e a f leafleaf个叶子两两配对向上取整适用于网络可靠性分析、关键路径识别、图加固优化类问题【算法标签】#双连通分量【代码详解】#includebits/stdc.husingnamespacestd;// 常量与全局变量 constintN5000;// 最大节点数constintM20005;// 最大边数注意双向边所以是两倍intn,m;// n: 节点数, m: 边数// ---------- 邻接表相关 ----------inth[N];// 邻接表头结点inte[M];// 存储边的终点intne[M];// 存储下一条边的索引intidx;// 边的编号计数器从0开始// ---------- Tarjan 相关 ----------intdfn[N];// 时间戳节点首次被访问的顺序intlow[N];// 能通过回边到达的最小时间戳inttot;// 时间戳计数器stackintstk;// 栈用于存储当前正在处理的节点// ---------- 桥与边双连通分量相关 ----------intbri[M];// 标记边是否为桥1表示是桥intcon_cnt;// 边双连通分量的总数intcon_id[N];// 每个节点所属的边双连通分量编号intcon_size[N];// 每个边双连通分量的大小intd[N];// 每个边双连通分量的度数在缩点树中的度数vectorintans[N];// 存储每个边双连通分量包含的节点// 添加边 voidadd(inta,intb){e[idx]b;// 存储边的终点ne[idx]h[a];// 头插法h[a]idx;// 更新头结点}// Tarjan 算法求边双连通分量 voidtarjan(intx,intin_edge){dfn[x]low[x]tot;// 初始化时间戳stk.push(x);// 当前节点入栈// 遍历 x 的所有邻接点for(intih[x];i!-1;ine[i]){intye[i];// 邻接点 yif(!dfn[y])// y 尚未访问{tarjan(y,i);// 递归访问 ylow[x]min(low[x],low[y]);// 用子树更新 low[x]// 判断边 (x, y) 是否为桥if(low[y]dfn[x]){// 标记该边和其反向边为桥bri[i]bri[i^1]true;}}// 如果是回退边且不是刚刚过来的那条反向边elseif(i!(in_edge^1)){low[x]min(low[x],dfn[y]);// 用回边更新 low[x]}}// 如果 x 是边双连通分量的根节点if(dfn[x]low[x]){con_cnt;// 新建一个边双连通分量while(1){intystk.top();// 取出栈顶节点stk.pop();// 弹出栈顶con_id[y]con_cnt;// 记录节点 y 所属的分量编号con_size[con_cnt];// 更新分量大小ans[con_cnt].push_back(y);// 将节点加入该分量if(yx)// 直到弹出 x 为止break;}}}// 主函数 intmain(){// 读取节点数和边数cinnm;// 初始化邻接表头结点为 -1memset(h,-1,sizeof(h));// 读入 m 条无向边while(m--){intu,v;cinuv;add(u,v);// 添加正向边add(v,u);// 添加反向边}// 从节点 1 开始执行 Tarjan 算法tarjan(1,0);// 统计缩点后每个分量的度数 for(inti0;iidx;i){if(bri[i])// 如果该边是桥{d[con_id[e[i]]];// 该边终点所在分量的度数加1}}// 统计叶子节点度数为1的分量 intcnt0;for(inti1;icon_cnt;i){if(d[i]1)// 度数为1即为叶子节点{cnt;}}// 输出答案 // 将叶子节点两两配对需要的最少边数为 (cnt 1) / 2cout(cnt1)/2endl;return0;}【运行结果】7 7 1 2 2 3 3 4 2 5 4 5 5 6 5 7 2

相关新闻

3步解锁Android上的Linux魔法:proot-distro终极指南

3步解锁Android上的Linux魔法:proot-distro终极指南

3步解锁Android上的Linux魔法:proot-distro终极指南 【免费下载链接】proot-distro An utility for managing installations of the Linux distributions in Termux. 项目地址: https://gitcode.com/gh_mirrors/pr/proot-distro 你是否曾在Android设备上渴望…

2026/6/27 10:40:53阅读更多 →
手把手教你用Docker容器部署DNF私服:从零到开服的完整指南

手把手教你用Docker容器部署DNF私服:从零到开服的完整指南

手把手教你用Docker容器部署DNF私服:从零到开服的完整指南 【免费下载链接】dnf 项目地址: https://gitcode.com/gh_mirrors/dnf/dnf 还在为搭建DNF私服繁琐的环境配置而烦恼吗?1995chen/dnf项目为你提供了一站式容器化解决方案,只需…

2026/6/27 11:54:54阅读更多 →
BaiduPCS-Go终极加速指南:从蜗牛到满速的8个专业技巧

BaiduPCS-Go终极加速指南:从蜗牛到满速的8个专业技巧

BaiduPCS-Go终极加速指南:从蜗牛到满速的8个专业技巧 【免费下载链接】BaiduPCS-Go iikira/BaiduPCS-Go原版基础上集成了分享链接/秒传链接转存功能 项目地址: https://gitcode.com/GitHub_Trending/ba/BaiduPCS-Go 你是否厌倦了百度网盘那令人抓狂的下载速度…

2026/6/27 9:39:17阅读更多 →
m序列的应用

m序列的应用

一、m序列核心考点整合1. 基本定义m序列 最长线性反馈移位寄存器序列,属于典型伪随机(PN)序列。- 级数为r级移位寄存器;- 除去全0死态,最多遍历2^r-1个非零状态;- 最大周期:P2^r-1。- 产生条件…

2026/6/27 18:21:36阅读更多 →
CODESYS 国产紧凑型 PLC 选型与实操指南:Bronze100 系列硬件、软件、现场落地全解析

CODESYS 国产紧凑型 PLC 选型与实操指南:Bronze100 系列硬件、软件、现场落地全解析

目前中小型自动化项目里,很多工程师想要支持标准 CODESYS、性价比高、IO 扩展灵活的国产控制器,进口 CODESYS PLC 价格门槛高,小设备用传统小型 PLC 又缺少标准化编程环境。本文结合 Bronze100 系列 PLC 原厂应用手册,完整梳理硬件…

2026/6/27 18:21:36阅读更多 →
TikTok商家入驻避坑指南:2026年最新完整流程与实操技巧

TikTok商家入驻避坑指南:2026年最新完整流程与实操技巧

随着TikTok Shop在全球市场的快速扩张,越来越多的中国卖家开始关注这片蓝海。但入驻流程中的种种"坑"让不少新手卖家望而却步——环境配置不当导致账号关联、材料准备不齐全被拒、好不容易注册成功却发现无法正常运营。今天这篇文章,结合2026年…

2026/6/27 18:21:36阅读更多 →
火山引擎谭待:Seedance更大想象空间在世界模型

火山引擎谭待:Seedance更大想象空间在世界模型

"“质变点”到来,AI 正式进入“生产级”时代"作者 | 简 安编辑 | 卢旭成6月23日,火山引擎Force原动力大会在北京举办。会上,火山引擎总裁谭待公布了一组数据:截至今年6月,豆包大模型日均Token调用量已突破…

2026/6/27 18:21:36阅读更多 →
FastAPI + WebRTC + RAG 搭建实时语音助手:Voice Agent Demo 完整步骤

FastAPI + WebRTC + RAG 搭建实时语音助手:Voice Agent Demo 完整步骤

目录一、整体链路:从麦克风到实时转写二、为什么 Voice Agent 要优先接流式 ASR三、前端:浏览器获取麦克风音频四、后端:FastAPI 负责信令,aiortc 负责接音频五、aiortc 接收到的音频帧怎么转 PCM六、把 ASR 封装成一个可替换接口…

2026/6/27 18:21:36阅读更多 →
服装零售管理效率测评:进销存系统如何影响库存周转与利润透明度

服装零售管理效率测评:进销存系统如何影响库存周转与利润透明度

“客流少、复购低、客单小、压库存,不知道利润从哪里提升”——这是过去十年实体服装店反复提及的痛点,但真正可怕的是:多数老板根本不知道自己哪一笔钱赚得糊涂,哪一笔钱亏得冤枉。 中国服装协会《数字化转型选型目录》的调研显示…

2026/6/27 18:16:36阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/27 11:20:40阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/27 5:46:02阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/27 11:20:39阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →