首页 > 其他分享 >P2764 最小路径覆盖问题

P2764 最小路径覆盖问题

时间:2023-09-26 21:14:38浏览次数:32  
标签:匹配 ll 路径 最小 match rl P2764 define

prologue

看见题解区好多神犇都是用 网络流 来做的,但是蒟蒻在刚学完 二部图 之后就来刷题了,对于这个题的路径输出有一个 比较新颖 的搞法,所以说就来写了这篇题解。

analysis

首先,我们为了将它转换成为一个 二部图,我们需要对它进行拆点操作(其实最后我跑起来并没有拆点),然后对它进行分析。

(下面左部为出度的点,右部为入度的点)

这个时候,原图中的每条路径转化到新图中,每一个点都可以对应出来一个匹配。每一条路径的 终点 都会对应到 左部 一个 非匹配点。这个时候我们要求 最小路径覆盖,就等价于 左部非匹配点最少,即这个图的 最大匹配。我们求最大匹配可以使用 匈牙利算法(之后输出合法路径需要)。

记我们的 最大匹配 为 \(m\),最小路径覆盖 就为 \(n - m\)。

之后我们再考虑怎么去输出合法路径。

我们观察我们上面匈牙利算法中的 \(match\) 数组,每一个 右部 点的 \(match\) 都会对应到我们一个新图中的一个 左部点,我们再将这个点放到 右部点 来看,会由它的 \(match\) 对应一个 左部点。重复以上过程,直到我们无法再匹配 左部点

这个不断往回匹配的过程我们可以用 递归 来解决,边界条件就是匹配到 \(0\)。我们只需要在跑这个递归的过程中用一个 \(vector\) 来记录路径就行。

code time

(我下面的这个 \(cnt\) 写的稀碎,我知道为啥,但是调不出来,除了占空间之外好像没啥缺点,还能当作一个(虚假的)可持久化来看)

using namespace std;
#define ll long long
#define rl register ll
#define x first
#define y second

typedef pair<ll, ll> pll;

const ll N = 160;

ll n, m;

bool st[N], g[N][N];

ll cnt, pre_cnt;

ll match[N];

pll pre[N];

vector<ll> path[N];

inline bool find(ll u)
{
	for(rl i=1; i <= n; ++ i) if(g[u][i] && !st[i])
	{
		st[i] = true;
		
		ll t = match[i];
		if(!t || find(t))
		{
			match[i] = u;
			return true;
		}
	}
	
	return false;
}

inline void get_path(ll u)
{
	path[cnt].push_back(u);
	st[u] = 1;
	if(!pre[u].y) { cnt ++ ; return ;}
	get_path(pre[u].y);
}

inline bool cmp(pll a, pll b)
{
	return a.y > b.y;
}

int main()
{
	cin >> n >> m;
	
	for(rl i=1; i <= m; ++ i)
	{
		ll a, b;
		cin >> a >> b;
		g[a][b] = true; 
	}
	
	ll res = 0;
		
	for(rl i=1; i <= n; ++ i)
	{
		memset(st, 0, sizeof st);
		if(find(i)) res ++ ;
	}
	
	memset(st, 0, sizeof st);
	
	for(rl i=1; i <= n; ++ i)
		pre[i] = {i, match[i]};
	
	for(rl i=n; i; -- i) if(!st[i] && pre[i].x) get_path(pre[i].x);
	
	for(rl i=cnt - n + res; i < cnt; ++ i)
	{
		for(rl j : path[i])
			cout << j << " ";
			
		cout << endl;
	}
	
	cout << n - res << endl;
	return 0;
}

标签:匹配,ll,路径,最小,match,rl,P2764,define
From: https://www.cnblogs.com/carp-oier/p/17731169.html

相关文章

  • os.path:Python操作和处理文件路径
    前言os.path是平台独立的文件名管理库,使用该库能够很方便来处理多个平台上的文件。即使程序不打算在平台之间移值,也应当使用os.path库来完成可靠的文件名解析。本篇博文将详细介绍os.path库的用法。解析路径的基本用法os.path中的第一组函数可以用来将表示文件名的字符串解析......
  • 如何快速找到win10系统中的开机启动文件所在路径
    在网站系统开发过程中,我们会遇到一些服务器下线导致的网站无法打开的情况,就需要重启服务器,如果每次手动去操作,实在是很繁琐,所以咱们可以利用开机自启的方式。而要这样设置的话,就需要找到开机自启的目录,Win10开机启动文件夹可以让用户直接复制软件进去,开机就会自动启动这些软件,非常......
  • R语言用普通最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类|附代码数
    原文链接:http://tecdat.cn/?p=21379 原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于回归的研究报告,包括一些图形和统计输出。本文我们对逻辑回归和样条曲线进行介绍。logistic回归基于以下假设:给定协变量x,Y具有伯努利分布,  目的是估计参数β。回想一下,针对该......
  • GAN之最大最小博弈
    我们已经知道,GAN使用的损失函数为特殊的二进制交叉熵函数(BCELoss),公式常写作\[\mathop{min}\limits_G\mathop{max}\limits_DV(D,G)=\mathbb{E}_{x\simPdata(x)}[logD(x)]+\mathbb{E}_{z\simPz(z)}[log(1-D(G(z)))]\]但是,这其中的\(\mathop{min}\limits_G\mathop{ma......
  • rac多路径下添加lun(centos 6)
    环境:OS:Centos6.9DB:11.2.0.4 1.虚拟机添加磁盘 2.每个登录查看磁盘情况节点1:[root@rac01bin]#lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTsr011:011024M0romsda8:0......
  • 从文件路径中提取文件名的shell操作
    Sundray-SW/extdir#sfp=/extdir/debug_bin/ops-devsdSundray-SW/extdir#echo${sfp##*/}ops-devsdSundray-SW/extdir#basename${sfp}ops-devsdSundray-SW/extdir#dirname${sfp}/extdir/debug_bin ${}的一些特殊功能:file=/dir1/dir2/dir3/my.file.txt${file#*/}:拿......
  • 更改Win10桌面文件路径,给系统盘瘦身
    1、首先我们需要在F磁盘中创建一个名叫“桌面”的文件夹,具体效果如下图所示。2、然后进入此电脑,再进入系统盘,进入“用户”的文件夹,再进入“系统的账户名”(其实就是本机的用户名),这时我们可以看到“桌面”的图标,我们右键点击“桌面”,选择“属性”菜单,具体如下图所示。3、在桌面属性的......
  • 用其它路径的pip安装包
    D:\ProgramData\Anaconda3\python.exe-mpipinstall--upgradepip(base)C:\WINDOWS\system32>D:\ProgramData\Anaconda3\python.exe-mpipinstall--upgradepipRequirementalreadysatisfied:pipind:\programdata\anaconda3\lib\site-packages(22......
  • 代码随想录算法训练营-动态规划-2|62. 不同路径
    62. 不同路径 1classSolution:2defuniquePaths(self,m:int,n:int)->int:3#创建一个二维列表用于存储唯一路径数4dp=[[0]*nfor_inrange(m)]56#设置第一行和第一列的基本情况7foriinran......
  • 欧拉路径和欧拉回路
    这是之前关于欧拉路的两篇博客。关于欧拉路的逆序压栈问题:here。22年写的一个小总结:here。关于欧拉路,主要疑点在于两个:一是压栈输出的原理;二是打上标记后时间复杂度退化的问题。压栈输出的原理走到点u时,有两种情况:u此时是终点,那么没有没走过的边与之相连。u此时不是终点......