【网络流24题】 最小路径覆盖问题

题目描述

给定有向图 G=(V,E) 。设 P 是 G 的一个简单路(顶点不相交)的集合。如果 V 中每个定点恰好在P的一条路上,则称 P 是 G 的一个路径覆盖。PP中路径可以从 V 的任何一个定点开始,长度也是任意的,特别地,可以为 0 。G 的最小路径覆盖是 G 所含路径条数最少的路径覆盖。设计一个有效算法求一个 GAP (有向无环图) G 的最小路径覆盖。

输入格式

第一行有 22 个正整数 n 和 m 。 n 是给定GAP(有向无环图) G 的顶点数, m 是 G 的边数。接下来的 m 行,每行有两个正整数 i 和 j 表示一条有向边 (i,j)。

输出格式

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

输入输出样例
输入 #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

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

分析

如果全部点本身作为一条路径,那总共有 n n n 条路径。任何两个点相连(一个点入度与出度最多为 1 1 1 ),都会使路径数减 1 1 1,现在就要让相连的点尽量多。
应该不难想到这是最大匹配问题(好吧有点难想?
将每个点 i i i 拆成两个点 i , i ′ i,i' i,i,对于每条有向边 ( a , b ) (a,b) (a,b),从 a a a b ′ b' b 连一条边,表示这是一个匹配。如图。
在这里插入图片描述
这样,跑最大匹配,就是最多可以连的连边数。
最小路径覆盖 = 点数 - 最大匹配数

代码如下

#include <bits/stdc++.h>
#define N 100005
#define inf 2147483647
using namespace std;
struct node{
   
	int a, b, c, n;
}d[N * 2]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值