P2764 最小路径覆盖问题

题面

题目描述

«问题描述:

给定有向图 \(G=(V,E)\) 。设 \(P\) 是 \(G\) 的一个简单路(顶点不相交)的集合。如果 \(V\) 中每个顶点恰好在 \(P\) 的一条路上,则称 \(P\) 是 \(G\) 的一个路径覆盖。 \(P\) 中路径可以从 \(V\) 的任何一个顶点开始,长度也是任意的,特别地,可以为 \(0\) 。 \(G\) 的最小路径覆盖是 \(G\) 的所含路径条数最少的路径覆盖。设计一个有效算法求一个有向无环图 \(G\) 的最小路径覆盖。提示:设 $V= { 1,2,...,n } $ ,构造网络 \(G1=(V1,E1)\) 如下:

«编程任务:

对于给定的给定有向无环图 \(G\) ,编程找出 \(G\) 的一个最小路径覆盖。

输入输出格式

输入格式:

输入文件第 \(1\) 行有 \(2\) 个正整数 \(n\) 和 \(m\) 。 \(n\) 是给定有向无环图 \(G\) 的顶点数, \(m\) 是 \(G\) 的边数。接下来的 \(m\) 行,每行有 \(2\) 个正整数 \(i\) 和 \(j\) ,表示一条有向边 \((i,j)\) 。

输出格式:

从第 \(1\) 行开始,每行输出一条路径。文件的最后一行是最少路径数。

输入输出样例

输入样例:

11 12
1 2
1 3
1 4
2 5
3 6
4 7
5 8
6 9
7 10
8 11
9 11
10 11

输出样例:

1 4 7 10 11
2 5 8
3 6 9
3

说明

\(1 \leq n \leq 150,1 \leq m \leq 6000\)

思路

“最小路径覆盖大家都会吧?” --老师

“会啊。” --huyufeifei

“嗯。” --logeadd

国庆集训正式开始啦!今天早上讲的是图论。老师打开的 \(PPT\) 标题为 NOI中的图论算法 ,身为蒟蒻的我还以为老师少打了一个 p ,结果讲了一上午的黑题...我的任务计划变成了上午讲过的题:

讲到P2304 [NOI2015]小园丁与老司机的时候老师问了上面的那个问题,大家都说会,深深感受到了周围都是神仙的恐惧...我就现在把这题写了。

说下思路:首先最小路径覆盖的最坏答案就是 \(n\) ,也就是每个节点都不得不用一条路径去覆盖它。而很容易发现,有边相连的两个点可以用同一路径来覆盖,那么我们就可以把这样的两个点缩到同一条路径之中。能把更多的点缩起来,就能用最少的边达成目的。设我们能缩 \(k\) 组点,那么最终答案就是 \(n-k\) 。

因为每个点只能缩一次,所以就可以用二分图最大匹配的方法来转换问题,匈牙利算法和最大流都是可行的,在这里我使用的是码量较小的匈牙利。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=160;
const int MAXM=6010;
int n,m,ans,match[MAXN],inv[MAXN];
int cnt,top[MAXN],to[MAXM],nex[MAXM];
int js,edge[MAXN];
bool vis[MAXN];
int read()
{
int re=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return re;
}
bool dfs(int now)
{
for(int i=top[now];i;i=nex[i])
{
if(!vis[to[i]])
{
vis[to[i]]=true;
if(!match[to[i]]||dfs(match[to[i]]))
{
match[to[i]]=now;
inv[now]=to[i];
return true;
}
}
}
return false;
}
void fd(int now)
{
vis[now]=true,edge[js++]=now;
if(inv[now]&&!vis[inv[now]]) fd(inv[now]);
if(match[now]&&!vis[match[now]]) fd(match[now]);
}
int main()
{
ans=n=read(),m=read();
while(m--)
{
int x=read(),y=read();
to[++cnt]=y,nex[cnt]=top[x],top[x]=cnt;
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof vis);
if(dfs(i)) ans--;
}
for(int i=1;i<=n;i++)
{
js=0;
if(!vis[i])
{
fd(i);
sort(edge,edge+js);
for(int j=0;j<js;j++) printf("%d ",edge[j]);
puts("");
}
}
printf("%d",ans);
return 0;
}

Luogu P2764 最小路径覆盖问题(二分图匹配)的更多相关文章

  1. luogu P2764 最小路径覆盖问题

    题目描述 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任 ...

  2. 洛谷P2764 最小路径覆盖问题(二分图)

    题意 给出一张有向无环图,求出用最少的路径覆盖整张图,要求路径在定点处不相交 输出方案 Sol 定理:路径覆盖 = 定点数 - 二分图最大匹配数 直接上匈牙利 输出方案的话就不断的从一个点跳匹配边 # ...

  3. LUOGU P2764 最小路径覆盖问题 (最小路径点覆盖)

    解题思路 有向图最小路径点覆盖问题,有这样的结论就是有向图最小路径点覆盖等于n-拆点二分图中最大匹配.具体怎么证明不太知道..输出方案时找到所有左部未匹配的点一直走$match​$就行了. #incl ...

  4. 【luogu P2764 最小路径覆盖问题】 模板

    题目链接:https://www.luogu.org/problemnew/show/P2764 把每个点在左边建一遍右边建一遍,再加上源点汇点,跑最大流,n-最大流就是答案. #include &l ...

  5. 洛谷 P2764 最小路径覆盖问题 解题报告

    P2764 最小路径覆盖问题 问题描述: 给定有向图\(G=(V,E)\).设\(P\) 是\(G\) 的一个简单路(顶点不相交)的集合.如果\(V\) 中每个顶点恰好在\(P\) 的一条路上,则称\ ...

  6. P2764 最小路径覆盖问题 网络流重温

    P2764 最小路径覆盖问题 这个题目之前第一次做的时候感觉很难,现在好多了,主要是二分图定理不太记得了,二分图定理 知道这个之后就很好写了,首先我们对每一个点进行拆点,拆完点之后就是跑最大流,求出最 ...

  7. Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)

    Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...

  8. 【Luogu】P2764最小路径覆盖(拆点求最大匹配)

    题目链接 这个……学了一条定理 最小路径覆盖=原图总点数-对应二分图最大匹配数 这个对应二分图……是什么呢? 就是这样 这是原图 这是拆点之后对应的二分图. 然后咱们的目标就是从这张图上跑出个最大流来 ...

  9. 洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】

    题目链接:https://www.luogu.org/problemnew/show/P2764 题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V ...

随机推荐

  1. js基础应用-打字机,震动窗口

    js基础应用一,窗口震动 html+js代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  2. Luogu P2484 [SDOI2011]打地鼠(模拟+前缀和)

    P2484 [SDOI2011]打地鼠 题意 题目描述 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地 ...

  3. 导入excel并进行数据提取

    /** * @description: 导入excel并进行数据提取 * @param {type} * @return: */ Vue.prototype.$importExcel = functi ...

  4. 集合遍历remove时ConcurrentModificationException异常

    1.集合遍历时候,有时候需要remove或add操作,这时候遍历方式可能会影响程序运行 例如: @Test public void test1() { List<Integer> intL ...

  5. 第十章 Odoo 12开发之后台视图 - 设计用户界面

    本文将学习如何为用户创建图形化界面来与图书应用交互.我们将了解不同视图类型和小组件(widgets)之间的差别,以及如何使用它们来提供更优的用户体验. 本文主要内容有: 菜单项 窗口操作(Window ...

  6. CF148D Bag of mice (期望dp)

    传送门 # 解题思路 ​    ~~这怕是本蒟蒻第一个独立做出来的期望$dp$的题,发篇题解庆祝一下~~.首先,应该是能比较自然的想出状态设计$f[i][j][0/1]$ 表示当前还剩 $i$个白老鼠 ...

  7. 苹果CMS

    本篇将主要讲解使用过程中普遍遇到的“问题”,这些问题并非是BUG,通常是需要我们自己去注意的一些点.(会结合用户反馈持续补充)http://www.maccms.com/doc/v10/faq.htm ...

  8. java基础之二维数组-杨辉三角

    首先呢你要知道什么是杨辉三角? 答:杨辉三角,是二项式系数在三角形中的一种几何排列. 简单的说一下就是两个未知数和的幂次方运算后的系数问题,比如(x+y)的平方=x的平方+2xy+y的平方,这样系数就 ...

  9. wpf之渐变色LinearGradientBrush

    xmal代码: <Grid Name="grid1"> <Grid.Background> <LinearGradientBrush> < ...

  10. 10-2-点击生成10个div

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...