博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【网络流24题】最小路径覆盖问题 题解
阅读量:2307 次
发布时间:2019-05-09

本文共 1599 字,大约阅读时间需要 5 分钟。

题目大意: 给出一个DAG,要找出最少的路径,满足覆盖所有点,并且路径之间不相交。

题解

有一个结论:路径数=点数-被覆盖边数。

证明很简单,因为每一条路径上都会有边数 + 1 +1 +1个点,所以对于每条路径,都满足路径数(1)+边数=点数。

由于要让路径数最小,所以要求出最大的被覆盖边数。

于是把每个点拆开得到一张二分图,对于原图中的一条边 ( x , y ) (x,y) (x,y),在二分图中连一条从左边的 x x x 到右边的 y y y 的边。然后源点向左边的点连边,右边的点向汇点连边,跑一发最大流就得到了最大被覆盖边数。

由于每个点只会在一条路径中,所以每个点的后继点都是唯一的,跑网络流的时候顺便记录下来即可求出所有路径。

代码如下:

#include 
#include
#include
using namespace std;#define maxn 100010int n,m,S,T;struct edge{
int y,z,next;};edge e[maxn<<1];int first[maxn],len=1;void buildroad(int x,int y,int z){
e[++len]=(edge){
y,z,first[x]}; first[x]=len;}int h[maxn],q[maxn],st,ed;bool bfs(){
memset(h,0,sizeof(h)); st=ed=1;q[st]=S;h[S]=1; while(st<=ed) {
int x=q[st++]; for(int i=first[x];i;i=e[i].next) if(!h[e[i].y]&&e[i].z)h[q[++ed]=e[i].y]=h[x]+1; } return h[T];}int to[maxn];bool v[maxn];int dfs(int x,int flow){
if(x==T)return flow; int tt=0,p; for(int i=first[x];i;i=e[i].next) {
int y=e[i].y; if(h[y]==h[x]+1&&e[i].z) {
p=dfs(y,min(e[i].z,flow-tt));tt+=p; if(p>0) {
e[i].z-=p;e[i^1].z+=p;to[x]=y; if(x!=S&&y-n>0)v[y-n]=true; if(tt==flow)break; } } } if(!tt)h[x]=0; return tt;}int main(){
scanf("%d %d",&n,&m);S=2*n+1,T=S+1; for(int i=1;i<=n;i++) buildroad(S,i,1),buildroad(i,S,0), buildroad(i+n,T,1),buildroad(T,i+n,0); for(int i=1,x,y;i<=m;i++)scanf("%d %d",&x,&y), buildroad(x,y+n,1),buildroad(y+n,x,0); int ans=0;while(bfs())ans+=dfs(S,999999999); for(int i=1;i<=n;i++) if(!v[i]) {
int j=i;printf("%d ",j); while(to[j]!=T&&to[j])j=to[j]-n,printf("%d ",j); printf("\n"); } printf("%d",n-ans);}

转载地址:http://zjnib.baihongyu.com/

你可能感兴趣的文章
大数据方面和java方面资料链接
查看>>
myeclipse5.5.1 GA开发工具注册码
查看>>
vsftp实例【用于文件的存储和共享】
查看>>
hadoop 透明加密 kms transparent
查看>>
微博用户标签自动生成算法
查看>>
数字证书及CA的扫盲介绍
查看>>
SSL与TLS的区别以及介绍
查看>>
mavenRepository【maven仓库,全都是maven项目,自己可以在里面下载需要的jar包】
查看>>
yiluo----- Maven基础-默认中央仓库[settings.xml 配置详解 ]
查看>>
yiluo-----Eclipse 插件Maven在使用 add dependency,找不到包,解决办法
查看>>
yiluo-----web.xml语句顺序问题
查看>>
Axis2 Web Service安全之rampart 【加密解密的基本概念以及实例代码】
查看>>
360doc-----CXF方式发布WebService全步骤 [未试验]
查看>>
360doc-----简单CXF方式的webService客户端调用范例
查看>>
Cxf+wss4j的WS-Security实现【未验证】
查看>>
tomcat开启SSL8443端口的方法 【文章内容仅供参考】
查看>>
Tomcat配置https协议、以及http协议自动REDIRECT到HTTPS【没有试验,内含设置强制https访问】
查看>>
CA根证书制作【仅供参考】-----win7 windows server 2008R2下 https SSL证书安装的搭配(搭配https ssl本地测试环境)
查看>>
快速排序 迭代实现
查看>>
二叉树的遍历
查看>>