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. ecshop二次开发笔记

    1. robots.txt 爬虫协议 网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取. 2. 入口文件 index.php 3. 目录结构分析 admin 后台 api 接口 ...

  2. Python基础 第三章 使用字符串(3)字符串方法&本章小结

    字符串的方法非常之多,重点学习一些最有用的,完整的字符串方法参见<Python基础教程(第三版)>附录B. 模块string,虽然风头已小,但其包含了一些字符串方法中没有的常量和函数,故将 ...

  3. Python 第一节随堂练习

    作业: 1 从键盘输入一个整数,判断该数字能否被2和3同时整除,能否被2整除,能否被3整除,不能被2和3整除,输出相应信息 1 my_num = int(input('请输入一个整数')) 2 if ...

  4. MVC部分视图的使用(Html.Partial/RenderPartial、Html.Action/RenderAction、RenderPage)

    ASP.NET MVC 里页面往往会有许多重用的地方,可以进行封装重用. 使用部分视图有以下优点: 1. 可以简写代码. 2. 页面代码更加清晰.更好维护. 在视图里有多种方法可以 加载部分视图,包括 ...

  5. c# internal关键字

    对于一些大型的项目,通常由很多个DLL文件组成,引用了这些DLL,就能访问DLL里面的类和类里面的方法.比如,你写了一个记录日志的DLL,任何项目只要引用此DLL就能实现记录日志的功能,这个DLL文件 ...

  6. JavaScript Basics_Fundamentals Part 2_A simple calendar

    下方的日历框架是从 Active learning: A simple calendar 上整过来的. 主要任务是用 if...else 语句来让日历本显示出每月相对应的天数,相关代码已经给出,我们只 ...

  7. vue项目中使用特殊字体

    项目开发中遇到要是有‘数字’字体的情况,样式如下 网上查了一下实现的方法很简单,而且具体的实现方式大致相同,可以参考以下几个链接: https://www.cnblogs.com/zhangnan35 ...

  8. 基于Vue实现拖拽效果

    参考地址:基于Vue实现拖拽效果 参考链接中讲的比较详细,我只使用了其中自定义指令的方法.整体代码如下: <template> <!-- 卡片 --> <div clas ...

  9. 第一章、前端之html

    目录 第一章.前端之html 一. html介绍 第一章.前端之html 一. html介绍 web服务本质 import socket sk = socket.socket() sk.bind((& ...

  10. Django_01_创建图书管理项目

    在django中,项目的组织结构为一个项目包含多个应用,一个应用对应一个业务模块 示例:创建项目的名称为test1,完成“图书-英雄”信息的维护,创建应用名称为booktest 创建项目:首先进入到虚 ...