题目链接

首先有\(n\)条路径,每条路径就是一个点,然后尽量合并,答案就是点数-合并数。

套路拆点,源连入,出连汇,原有的边入出连。

最大流就是最大合并数,第一问解决。

然后怎么输出方案?

我是找到所有路径中的最后一个点,然后根据残量网络一直往前跳,\(dfs\)倒序输出。

#include <cstdio>
#include <queue>
#include <cstdlib>
#include <cstring>
#define INF 2147483647
using namespace std;
const int MAXN = 360;
const int MAXM = 16010;
struct point{
int x, y, time;
}Now;
queue <int> q;
struct Edge{
int from, to, next, rest;
}e[MAXM];
int head[MAXN], num = 1, s, t, now, n, m, dis[MAXN], a, b;
inline void Add(int from, int to, int flow){
e[++num] = (Edge){ from, to, head[from], flow }; head[from] = num;
e[++num] = (Edge){ to, from, head[to], 0 }; head[to] = num;
}
int re(){
memset(dis, 0, sizeof dis);
q.push(s); dis[s] = 1;
while(q.size()){
now = q.front(); q.pop();
for(int i = head[now]; i; i = e[i].next)
if(e[i].rest && !dis[e[i].to])
dis[e[i].to] = dis[now] + 1, q.push(e[i].to);
}
return dis[t];
}
int find(int u, int flow){
if(u == t || !flow) return flow;
int sum = 0, T;
for(int i = head[u]; i; i = e[i].next)
if(e[i].rest && dis[e[i].to] == dis[u] + 1){
T = find(e[i].to, min(flow - sum, e[i].rest));
e[i].rest -= T; e[i ^ 1].rest += T; sum += T;
}
if(!sum) dis[u] = 0;
return sum;
}
int dinic(){
int ans = 0;
while(re()) ans += find(s, INF);
return ans;
}
void dfs(int u){
for(int i = head[u + n]; i; i = e[i].next)
if(e[i].to <= n && e[i].rest)
dfs(e[i].to);
printf("%d ", u);
}
int ans;
int main(){
scanf("%d%d", &n, &m); s = 345; t = 350;
for(int i = 1; i <= m; ++i){
scanf("%d%d", &a, &b);
Add(a, b + n, 1);
}
for(int i = 1; i <= n; ++i)
Add(s, i, 1), Add(i + n, t, 1);
ans = n - dinic();
for(int i = 1; i <= n; ++i){
int flag = 1;
for(int j = head[i]; j; j = e[j].next)
if(e[j].to > n && e[j].to <= 2 * n && !e[j].rest){
flag = 0; break;
}
if(flag) dfs(i),
putchar('\n');
}
printf("%d\n", ans);
return 0;
}

【洛谷 P2764】 最小路径覆盖问题(最大流)的更多相关文章

  1. 洛谷 P2764 最小路径覆盖问题 解题报告

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

  2. 洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】

    题目链接:https://www.luogu.org/problemnew/show/P2764 题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V ...

  3. 洛谷P2764 最小路径覆盖问题

    有向无环图的最小路径点覆盖 最小路径覆盖就是给定一张DAG,要求用尽量少的不相交的简单路径,覆盖有向无环图的所有顶点. 有定理:顶点数-路径数=被覆盖的边数. 要理解的话可以从两个方向: 假设DAG已 ...

  4. 【刷题】洛谷 P2764 最小路径覆盖问题

    题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...

  5. 洛谷P2764 最小路径覆盖问题(最大流)

    传送门 先说做法:把原图拆成一个二分图,每一个点被拆成$A_i,B_i$,若原图中存在边$(u,v)$,则连边$(A_u,B_v)$,然后$S$对所有$A$连边,所有$B$对$T$连边,然后跑一个最大 ...

  6. 洛谷 P2764 最小路径覆盖问题【匈牙利算法】

    经典二分图匹配问题.把每个点拆成两个,对于原图中的每一条边(i,j)连接(i,j+n),最小路径覆盖就是点数n-二分图最大匹配.方案直接顺着匹配dsf.. #include<iostream&g ...

  7. 洛谷 P2764(最小路径覆盖=节点数-最大匹配)

    给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别 ...

  8. 洛谷P2764 最小路径覆盖问题(二分图)

    题意 给出一张有向无环图,求出用最少的路径覆盖整张图,要求路径在定点处不相交 输出方案 Sol 定理:路径覆盖 = 定点数 - 二分图最大匹配数 直接上匈牙利 输出方案的话就不断的从一个点跳匹配边 # ...

  9. 洛谷 [P2764]最小路径覆盖问题

    二分图应用模版 #include <iostream> #include <cstdio> #include <algorithm> #include <cs ...

  10. 洛谷-p2764(最小路径覆盖)(网络流24题)

    #include<iostream> #include<algorithm> #include<queue> #include<cstring> #in ...

随机推荐

  1. 【C++】C++函数重载的总结

    函数重载: 出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数(overloaded function).一定要注意函数重载的两个关键词:形参列表和作用域. 任何程序有且仅有 ...

  2. javascript+html5+css3下拉刷新 数据效果

    文章摘自:suchso.com/projecteactual/javascript-html5-css3-taobao-xiala-data.html segmentfault.com/a/11900 ...

  3. innerHTML与innerText的区别: 前者获取的是dom对象内的所有html元素 后者获取的是dom对象里面的纯文本元素

  4. js function的方法名是一个变量 能被重复定义 当变量名一致时候 会使用最后一个function

  5. 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值

    题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...

  6. 【明哥报错簿】之【inside the host appBase has been specified, and will be ignored】和【did not find a matching property.】

    tomcat启动时有时候会报一些警告,项目有时候也是可以正常运行.但是警告出现还是要找到原因消灭掉,两个典型的警告解决办法如下: 1.[inside the host appBase has been ...

  7. MySQL慢查询日志ES索引模板

    { "template": "mysql-slow-log-*", "settings": { "index": { & ...

  8. 【题解】APIO2014回文串

    哇哦~想不到我有生之年竟然能够做出字符串的题目ヾ(✿゚▽゚)ノ虽然这题比较裸但依然灰常开心! 首先有一个棒棒的性质:本质不同的回文串最多有 O(n) 个.首先 manacher 把它们都找出来,然后问 ...

  9. oracle中建立job(任务)

    --Oracle trunc()函数的用法/**************日期********************/1.select trunc(sysdate) from dual --2013- ...

  10. Ubuntu 使用Compiz配置炫酷3D桌面

    先看一下效果 要实现这种3D 的效果其实很简单. Step 1:安装N卡驱动工具 sudo apt- 这个东西其实没有太大的作用. Step 2:安装Compiz sudo apt-get insta ...