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. spring cloud链路追踪组件sleuth和zipkin

    spring cloud链路追踪组件sleuth     主要作用就是日志埋点 操作方法 1.增加依赖             <dependency>      <groupId& ...

  2. django的admin密码忘记了怎么办?一分钟解决!!

    django-admin确实是在实际开发中很方便,然后项目开发一段时间放到一边,等你再去玩你当初的项目的时候,可能抱歉你的admin密码忘记了,其实解决办法有很多种,我直说最快的一种,直接重新建立一个 ...

  3. Python--类的调用

    类的调用 实例化 class Luffy: school = 'luffy' def __init__(self,name,age): self.Name = name self.Age = age ...

  4. shell习题第13题:监控nginx进程

    [题目要求] 在服务器上写一个脚本,要求如下 1. 每隔10秒去检查而一次服务器上的nginx进程数,如果>=500的时候,就需要自动重启一下nginx服务,并检测启动是否成功 2. 如没有正常 ...

  5. instanceof关键字 与 getClass()

    在equals()中使用getClass进行类型判断 我们在覆写equals()方法时,一般都是推荐使用getClass来进行类型判断,不是使用instanceof.我们都清楚instanceof的作 ...

  6. ACCESS打得开mdb,但打不开表,弹框提示未知错误。

    我的电脑有个一个奇怪的错误ACCESS能打开mdb数据库,但是打不开表,一打开就提示错误,只有俩字“未知”.重装OFFICE也不行!而且电脑上使用Access数据库的应用软件都不行了!都提示“未知”错 ...

  7. [JZOJ4307]喝喝喝--枚举

    [JZOJ4307]喝喝喝--枚举 题目链接 自行搜索 分析 我们需要找到所有不包含\((a_x,a_y),a_x \equiv k \mod a_y (x<y)\)这样的连续数对,转化一下变成 ...

  8. [NOIP2018模拟10.15]比赛报告

    闲扯 昨晚又颓到好晚,Yali的降智光环感觉持续至今... 题面好评 T1T3都玩过 逃) T1没看多久就开始写二分+并查集 然后T3看着眼熟想了一个多小时...结果啥都没想出来 赶紧看T2发现还是没 ...

  9. 爬虫遇到IP访问频率限制的解决方案

    背景: 大多数情况下,我们遇到的是访问频率限制.如果你访问太快了,网站就会认为你不是一个人.这种情况下需要设定好频率的阈值,否则有可能误伤.如果大家考过托福,或者在12306上面买过火车票,你应该会有 ...

  10. 日志(logging)与正则(re)模块

    logging模块 #日志:日常的流水 =>日志文件,将程序运行过程中的状态或数据进行记录,一般都是记录到日志文件中 #1.logging模块一共分为五个打印级别 debug.info.warn ...