洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】
题目链接:https://www.luogu.org/problemnew/show/P2764
题目描述
«问题描述:
给定有向图G=(V,E)。设P 是G 的一个简单路(顶点不相交)的集合。如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖。P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0。G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖。设计一个有效算法求一个有向无环图G 的最小路径覆盖。提示:设V={1,2,.... ,n},构造网络G1=(V1,E1)如下:

每条边的容量均为1。求网络G1的( 0 x , 0 y )最大流。
«编程任务:
对于给定的给定有向无环图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<=n<=150,1<=m<=6000
由@zhouyonglong提供SPJ
题解:
最小路径覆盖问题。答案就是N-最大二分匹配(证明略,感觉hihoCoder上讲的很详细,推荐看)。
将每个点拆点分成AB两部分,做最大二分匹配。然后源点到A部的点连边,边权为1;B部点到汇点连边,边权为1,跑最大流......
关于路径输出问题,可以从汇点开始找残余容量为0的点作为起始点递归输出路径...
代码:
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int N = *+;
const int M = *+;
const int inf = 1e9;
int n, m, S, T;
int dep[N], cur[N];
int head[N];
struct Edge{
int v, c, nex;
Edge(int _v=,int _c=,int _nex=):v(_v),c(_c),nex(_nex){}
}E[M]; int cnt;
void add(int u, int v, int c){
E[cnt].v = v;
E[cnt].c = c;
E[cnt].nex = head[u];
head[u] = cnt++;
} bool bfs() {
queue<int> q;
memset(dep, -, sizeof(dep));
q.push(S); dep[S] = ;
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = head[u]; ~i; i = E[i].nex) {
int v = E[i].v;
if(E[i].c && dep[v] == -) {
dep[v] = dep[u] + ;
q.push(v);
}
}
}
return dep[T] != -;
}
int dfs(int u, int flow) {
if(u == T) return flow;
int w, used=;
for(int i = head[u]; ~i; i = E[i].nex) {
int v = E[i].v;
if(dep[v] == dep[u] + ) {
w = flow - used;
w = dfs(v, min(w, E[i].c));
E[i].c -= w; E[i^].c += w;
if(v) cur[u] = i;
used += w;
if(used == flow) return flow;
}
}
if(!used) dep[u] = -;
return used;
}
int dinic() {
int ans = ;
while(bfs()) {
for(int i = ; i <= T;i++)
cur[i] = head[i];
ans += dfs(S, inf);
}
return ans;
}
void print(int x, int &f) {
if(x <= S) return;
if(f == ) f = ;
else printf(" ");
printf("%d", x); for(int i = head[x]; ~i; i = E[i].nex) {
if(!E[i].c){
print(E[i].v - n, f);
}
}
}
int main() {
int i, j, u, v;
scanf("%d%d", &n, &m);
memset(head, -, sizeof(head));
cnt = ;
S = ; T = *n+;
for(i = ; i < m; ++i) {
scanf("%d%d", &u, &v);
add(u, v+n, ); add(v+n, u, );
}
for(i = ; i <= n; ++i) add(S,i,),add(i,S,);
for(i = ; i <= n; ++i) add(i+n,T,),add(T,i+n,); int ans = dinic(); for(i = head[T]; ~i; i = E[i].nex) {
if(!E[i].c) {
int f = ;
print(E[i].v - n, f);
puts("");
}
}
printf("%d\n", n-ans);
return ;
} /*
7 7
1 2
1 3
2 4
3 4
4 5
4 6
5 7
*/
洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】的更多相关文章
- 洛谷 P2764 最小路径覆盖问题 解题报告
		
P2764 最小路径覆盖问题 问题描述: 给定有向图\(G=(V,E)\).设\(P\) 是\(G\) 的一个简单路(顶点不相交)的集合.如果\(V\) 中每个顶点恰好在\(P\) 的一条路上,则称\ ...
 - 洛谷P2764 最小路径覆盖问题
		
有向无环图的最小路径点覆盖 最小路径覆盖就是给定一张DAG,要求用尽量少的不相交的简单路径,覆盖有向无环图的所有顶点. 有定理:顶点数-路径数=被覆盖的边数. 要理解的话可以从两个方向: 假设DAG已 ...
 - 【刷题】洛谷 P2764 最小路径覆盖问题
		
题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...
 - 洛谷 P2764(最小路径覆盖=节点数-最大匹配)
		
给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别 ...
 - 洛谷P2764 最小路径覆盖问题(二分图)
		
题意 给出一张有向无环图,求出用最少的路径覆盖整张图,要求路径在定点处不相交 输出方案 Sol 定理:路径覆盖 = 定点数 - 二分图最大匹配数 直接上匈牙利 输出方案的话就不断的从一个点跳匹配边 # ...
 - 洛谷P2764 最小路径覆盖问题(最大流)
		
传送门 先说做法:把原图拆成一个二分图,每一个点被拆成$A_i,B_i$,若原图中存在边$(u,v)$,则连边$(A_u,B_v)$,然后$S$对所有$A$连边,所有$B$对$T$连边,然后跑一个最大 ...
 - 洛谷 P2764 最小路径覆盖问题【匈牙利算法】
		
经典二分图匹配问题.把每个点拆成两个,对于原图中的每一条边(i,j)连接(i,j+n),最小路径覆盖就是点数n-二分图最大匹配.方案直接顺着匹配dsf.. #include<iostream&g ...
 - 洛谷 [P2764]最小路径覆盖问题
		
二分图应用模版 #include <iostream> #include <cstdio> #include <algorithm> #include <cs ...
 - 洛谷-p2764(最小路径覆盖)(网络流24题)
		
#include<iostream> #include<algorithm> #include<queue> #include<cstring> #in ...
 
随机推荐
- 解决:maven 项目添加 pom 的 oracle 依赖
			
前言:maven 项目需要在 pom 文件中添加 oracle 的依赖. 如果报错:报找不到驱动:java.lang.ClassNotFoundException: oracle.jdbc.drive ...
 - Intellij IDEA run coverage之覆盖率测试
			
Intellij IDEA run coverage之覆盖率测试 idea 的coverage + 我们自己写的测试用例.最后看一下,我们要测的代码有没有测试到,这是一个不错的提高代码质量的方法. i ...
 - 在pom.xml中添加Spring依赖
			
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
 - future3.2 Tomcat启动时错误:Cannot rename original file to ...
			
其日志中第一个警告如下: 警告: Unexpected exception resolving reference java.io.IOException: Cannot rename origina ...
 - 关于session销毁的问题,invalidate() 和removeAttribute()
			
request.getSession().invalidate(); 销毁当前会话域中的所有属性 request.getSession().removeAttribute("username ...
 - unrecognized selector sent to class
			
Other Linker Flags=-ObjC -all_load Loads all members of static archive libraries. -ObjC Loads all me ...
 - 三、vue如何配置路由 、获取路由的参数、部分刷新页面、缓存页面
			
1.路由配置:所有的启动文件都在最初始的main.js文件里面,这个文件中首先需要引入: 2.路由文件配置说明: 3.如何获取页面url的参数? this.$route.query 4.页面之 ...
 - Week3——文档代码分析
			
该段代码代码显示了不使用异步处理的基本servlet: @WebServlet(urlPatterns={"/syncservlet"}) public class SyncSer ...
 - Maven环境变量配置和在Eclipse中的配置
			
1.Maven环境变量配置 M2_HOME :变量值为maven的安装目录 在path后添加%M2_HOME%\bin; 检查JDK,maven配置的cmd命令 echo %JAVA_HOME% ja ...
 - how webpack Hot Module Replacement works
			
https://medium.com/@rajaraodv/webpack-hot-module-replacement-hmr-e756a726a07