1. [网络流24题] 最小路径覆盖问题

    ★★☆ 输入文件:path3.in 输出文件:path3.out 评测插件

    时间限制:1 s 内存限制:128 MB

    算法实现题8-3 最小路径覆盖问题(习题8-13)

    ´问题描述:

    给定有向图G=(V,E)。设P是G的一个简单路(顶点不相交)的集合。如果V中每个

    顶点恰好在P的一条路上,则称P是G的一个路径覆盖。P中路径可以从V的任何一个顶

    点开始,长度也是任意的,特别地,可以为0。G的最小路径覆盖是G的所含路径条数最少

    的路径覆盖。

    设计一个有效算法求一个有向无环图G的最小路径覆盖。

    提示:

    设V={1,2,… ,n},构造网络G1=(V1,E1)如下:

    每条边的容量均为1。求网络G1的(x0,y0)最大流。

    ´编程任务:

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

    ´数据输入:

    由文件input.txt提供输入数据。文件第1行有2个正整数n和m。n是给定有向无环图

    G的顶点数,m是G的边数。接下来的m行,每行有2个正整数i 和j,表示一条有向边(i,j)。

    ´结果输出:

    程序运行结束时,将最小路径覆盖输出到文件output.txt中。从第1行开始,每行输出

    一条路径。文件的最后一行是最少路径数。

    输入文件示例

    input.txt

    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

    输出文件示例

    output.txt

    1 4 7 10 11

    2 5 8

    3 6 9

    3

    数据范围:

    1<=n<=150,1<=m<=6000
/*
最小路径覆盖数=V-最大流.
然后拆点建图.
搞一个超级源点和汇点跑dinic.
输出的时候在残余网络里找贡献边.
恩就是这样.
*/
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define MAXN 10001
using namespace std;
struct data{int v,next,c;}e[MAXN*4];
int n,m,max1=1e9,ans,tot,cut=1,dis[MAXN*2],head[MAXN*2],next[MAXN*2];
bool in[MAXN*2];
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void add(int u,int v,int x)
{
e[++cut].v=v;
e[cut].c=x;
e[cut].next=head[u];
head[u]=cut;
}
bool bfs()
{
memset(dis,-1,sizeof dis);
queue<int>q;
q.push(0);
dis[0]=0;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(dis[v]==-1&&e[i].c)
{
dis[v]=dis[u]+1;
q.push(v);
}
}
}
return dis[n*2+1]!=-1;
}
int dfs(int u,int y)
{
if(u==n*2+1) return y;
int rest=0;
for(int i=head[u];i&&rest<y;i=e[i].next)
{
int v=e[i].v;
if(dis[v]==dis[u]+1&&e[i].c)
{
int x=dfs(v,min(e[i].c,y-rest));
rest+=x;
e[i].c-=x;
e[i^1].c+=x;
}
}
if(!rest) dis[u]=-1;
return rest;
}
void print()
{
for(int u=1;u<=n;u++)
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(e[i].c==max1-1) in[v-n]=true,next[u]=v-n;
}
for(int i=1;i<=n;i++)
{
int x=i;
if(!in[x])
{
while(x) printf("%d ",x),x=next[x];
printf("\n");
}
}
}
void dinic(int s,int t)
{
while(bfs()) ans+=dfs(s,max1);
print();
printf("%d\n",n-ans);
return ;
}
int main()
{
freopen("path3.in","r",stdin);
freopen("path3.out","w",stdout);
int x,y;
n=read(),m=read();
for(int i=1;i<=n;i++) add(0,i,1),add(i,0,0);
for(int i=1;i<=n;i++) add(i+n,n*2+1,1),add(2*n+1,i+n,0);
for(int i=1;i<=m;i++)
{
x=read(),y=read();
add(x,y+n,max1),add(y+n,x,0);
}
dinic(0,n*2+1);
return 0;
}

Cogs 728. [网络流24题] 最小路径覆盖问题的更多相关文章

  1. cogs 728. [网络流24题] 最小路径覆盖问题 匈牙利算法

    728. [网络流24题] 最小路径覆盖问题 ★★★☆   输入文件:path3.in   输出文件:path3.out   评测插件时间限制:1 s   内存限制:128 MB 算法实现题8-3 最 ...

  2. COGS728. [网络流24题] 最小路径覆盖问题

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

  3. 网络流24题 最小路径覆盖(DCOJ8002)

    题目描述 给定有向图 G=(V,E) G = (V, E)G=(V,E).设 P PP 是 G GG 的一个简单路(顶点不相交)的集合.如果 V VV 中每个顶点恰好在 P PP 的一条路上,则称 P ...

  4. P2764 [网络流24题]最小路径覆盖问题[最大流]

    地址 这题有个转化,求最少的链覆盖→即求最少联通块. 设联通块个数$x$个,选的边数$y$,点数$n$个 那么有 $y=n-x$   即  $x=n-y$ 而n是不变的,目标就是在保证每个点入度.出度 ...

  5. cogs 14. [网络流24题] 搭配飞行员 二分图最大匹配 匈牙利算法

    14. [网络流24题] 搭配飞行员 ★★   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     飞行大队有 ...

  6. 【wikioi】1904 最小路径覆盖问题(最大流+坑人的题+最小路径覆盖)

    http://wikioi.com/problem/1904/ 这题没看数据的话是一个大坑(我已报告官方修复了),答案只要求数量,不用打印路径...orz 最小路径覆盖=n-最大匹配,这个我在说二分图 ...

  7. 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】

    P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...

  8. Cogs 461. [网络流24题] 餐巾(费用流)

    [网络流24题] 餐巾 ★★★ 输入文件:napkin.in 输出文件:napkin.out 简单对比 时间限制:5 s 内存限制:128 MB [问题描述] 一个餐厅在相继的N天里,第i天需要Ri块 ...

  9. Cogs 734. [网络流24题] 方格取数问题(最大闭合子图)

    [网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n 个方格的棋盘中,每个方格 ...

随机推荐

  1. php 求两个数组的差集应该注意的事情

    对于 phper 来说 array_diff 这个函数应该知道它的用途,获取两个数组的差集,我理解中的差集是这样的 但是执行下代码会发现结果并不是 <?php $a = [1,2,3,4,5]; ...

  2. Istio技术与实践02:源码解析之Istio on Kubernetes 统一服务发现

    前言 文章Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制结合Pilot的代码实现介绍了Istio的抽象服务模型和基于该模型的数据结构定义,了解到Istio上只是定义的服务发现的接 ...

  3. 训练技巧详解【含有部分代码】Bag of Tricks for Image Classification with Convolutional Neural Networks

    训练技巧详解[含有部分代码]Bag of Tricks for Image Classification with Convolutional Neural Networks 置顶 2018-12-1 ...

  4. LocalDate与Date转化

    // 01. java.util.Date --> java.time.LocalDateTimepublic void UDateToLocalDateTime() { java.util.D ...

  5. hdu 6140 思维

    题解:这道题中的数能组成的数构成了一个连续区间. 一开始只有 a1​​ 的时候能够构成 [-1, 1][−1,1] 中的所有整数. 如果一堆数能够构成 [-a, b][−a,b] 中的所有整数, 这时 ...

  6. *4.1 所有类型都从System.Object派生

  7. Mac命令行提示

    之前看到一个大神的终端主题好炫,所以自己也想弄一个.看了很多中文的教程都不是很靠谱,效果并没有实现.不能说人家的不对,只能说自己水平有限.后来直接去看 github 上的官方教程,因为是官方嘛~所以肯 ...

  8. Java检查异常和非检查异常,运行时异常和非运行时异常的区别

    通常,Java的异常(包括Exception和Error)分为检查异常(checked exceptions)和非检查的异常(unchecked exceptions).其中根据Exception异常 ...

  9. Async 配置线程池

    需要注意一下 ThreadPoolTaskExecutor  和 Executor  区别 @Configuration public class ExecutorConfig { /** Set t ...

  10. springboot Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

    报错如下: 在请求目标中发现无效字符.有效字符在RFC 7230和RFC 3986中定义. 原因是Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证. 就是 ...