最小路径覆盖详解

本文详细讲解了有向图中的最小路径覆盖问题,包括最小不相交路径覆盖和最小可相交路径覆盖的概念,并提供了求解这两种问题的方法:通过最大流或匈牙利算法寻找最大匹配。此外,还给出了相关编程竞赛题目及其解决方案。
摘要由CSDN通过智能技术生成

定义:通俗点讲,就是在一个有向图中,找出最少的路径,使得这些路径经过了所有的点。

而最小路径覆盖又分为:最小不相交路径覆盖最小可相交路径覆盖。

最小不相交路径覆盖 : 就是我们找到的每条路径不能相交,就是每条路径不能有同一个点。
最小可相交路径覆盖 : 这个与上面相对应,就是可以相交。

注意:每个点被自己覆盖,路径长度为0


求解最小不相交路径覆盖: 我们把每个点都拆成两个点,分为入点和出点,如果 u 到 v 有边,那么我们就让 u 的入点连向 v 的出点 , 最后跑一下最大流或者匈牙利 算出最大匹配。答案就是 点的数目 - 最大匹配数

求解最小可相交路径覆盖: 和上面很相似,但是我们再跑最大匹配时,我们先对原图进行一次闭包传递(通过Warshell传递闭包算法),然后过程就一样了。


最小不相交路径覆盖题目:POJ - 1422

AC代码:

#pragma GCC optimize(2)
#include<cstring>
#include<iostream>
#define int long long
using namespace std;
const int N=250;
int T,n,m,mat[N],vis[N],res;
int head[N],nex[N*N],to[N*N],tot;
void add(int a,int b){
   
	to[++tot]=b; nex[tot]=head[a]; head[a]=tot; 
}
bool find(int x,int id){
   
	for(int i
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值