题意:

求不相交的最小路径覆盖

思路:

连边跑二分图,匹配一条边相当于缩了一条边,答案为n-maxflow

如果是求可以相交的最小路径覆盖的话,先用Floyd跑出可达矩阵,然后所有可达的点连边跑二分图即可

代码:

这个dinic板子加边前要tot=1,否则每一对正反向流会乱掉

由于本题要输出方案,这里有两份代码,一份是跑最大流的时候记录流向,另一份是根据残余网络纪录流向

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <vector>
#include <ctime>
#include <map> #define fst first
#define sc second
#define pb push_back
#define mem(a, b) memset(a, b, sizeof(a))
#define lson l, mid, root << 1
#define rson mid + 1, r, root << 1 | 1
#define lc root << 1
#define rc root << 1 | 1
#define lowbit(x) ((x) & (-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PI;
typedef pair<ll, ll> PLL; const db eps = 1e-;
const int mod = 1e9 + ;
const int maxn = 4e4 + ;
const int maxm = 4e5 + ;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0); int head[maxn], d[maxn]; //层
int ver[maxm], edge[maxm], Next[maxm]; // edge[i]: c for edge_i
int n, m, s, t, tot, maxflow;
queue<int> q;
int st[maxn];
void add(int x, int y, int z) {
ver[++tot] = y, edge[tot] = z, Next[tot] = head[x], head[x] = tot;
st[tot]=x;
ver[++tot] = x, edge[tot] = , Next[tot] = head[y], head[y] = tot;
st[tot]=y;
}
int du[maxn];
bool bfs() {
mem(d, );
while (!q.empty()) q.pop();
q.push(s);
d[s] = ;
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = head[x]; i; i = Next[i]) {
if (edge[i] && !d[ver[i]]) {
q.push(ver[i]);
d[ver[i]] = d[x] + ;
if (ver[i] == t)
return true;
}
}
}
return false;
}
int nx[maxn];
int dinic(int x, int flow) {
if (x == t)
return flow;
int rest = flow, k;
for (int i = head[x]; i; i = Next[i]) {
if (edge[i] && d[ver[i]] == d[x] + ) {
k = dinic(ver[i], min(rest, edge[i]));
if (!k) {
d[ver[i]] = ;
} else {
edge[i] -= k;
edge[i ^ ] += k;
rest -= k;
}
}
}
return flow - rest;
}
int vis[maxn];
int pre[maxn];
int main() {
mem(pre, -);
mem(nx,-);
s = ;
t = ;
tot = ;
scanf("%d %d", &n, &m);
for (int i = ; i <= m; i++) {
int x, y;
scanf("%d %d", &x, &y);
x *= ;
y *= ;
add(x, y + , );
}
for (int i = ; i <= n; i++) {
add(s, i * , );
add(i * + , t, );
}
int maxflow = ;
int flow;
while (bfs()) {
while () {
flow = dinic(s, inf);
if (flow == )
break;
maxflow += flow;
}
}
for(int i = ; i <= tot; i++){
if(edge[i]==&&st[i]%==&&st[i]>=&&st[i]<=*n&&ver[i]!=s){
int x = st[i]/;
int y = (ver[i]-)/;
//printf("%d %d\n",x,y);
pre[y] = x;
nx[x] = y;
}
}
for(int i = ; i <= n; i++){
if(pre[i]==-){
int x = i;
while(x!=-){
printf("%d ", x);
x= nx[x];
}
printf("\n");
}
}
printf("%d\n", n - maxflow);
return ;
} /*
5 3
1 2 3 4 5
1 2 3
2 1 4
4 3 5
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <vector>
#include <ctime>
#include <map> #define fst first
#define sc second
#define pb push_back
#define mem(a, b) memset(a, b, sizeof(a))
#define lson l, mid, root << 1
#define rson mid + 1, r, root << 1 | 1
#define lc root << 1
#define rc root << 1 | 1
#define lowbit(x) ((x) & (-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PI;
typedef pair<ll, ll> PLL; const db eps = 1e-;
const int mod = 1e9 + ;
const int maxn = 4e2 + ;
const int maxm = 4e5 + ;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0); int head[maxn], d[maxn]; //层
int ver[maxm], edge[maxm], Next[maxm]; // edge[i]: c for edge_i
int n, m, s, t, tot, maxflow;
queue<int> q;
void add(int x, int y, int z) {
ver[++tot] = y, edge[tot] = z, Next[tot] = head[x], head[x] = tot; ver[++tot] = x, edge[tot] = , Next[tot] = head[y], head[y] = tot;
}
int du[maxn];
bool bfs() {
mem(d, );
while (!q.empty()) q.pop();
q.push(s);
d[s] = ;
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = head[x]; i; i = Next[i]) {
if (edge[i] && !d[ver[i]]) {
q.push(ver[i]);
d[ver[i]] = d[x] + ;
if (ver[i] == t)
return true;
}
}
}
return false;
}
int nx[maxn];
int dinic(int x, int flow) {
if (x == t)
return flow;
int rest = flow, k;
for (int i = head[x]; i; i = Next[i]) {
if (edge[i] && d[ver[i]] == d[x] + ) {
k = dinic(ver[i], min(rest, edge[i]));
if (!k) {
d[ver[i]] = ;
} else {
nx[x] = ver[i];
edge[i] -= k;
edge[i ^ ] += k;
rest -= k;
}
}
}
return flow - rest;
}
int vis[maxn];
int pre[maxn];
int main() {
mem(pre, -);
s = ;
t = ;
tot = ;
scanf("%d %d", &n, &m);
for (int i = ; i <= m; i++) {
int x, y;
scanf("%d %d", &x, &y);
x *= ;
y *= ;
add(x, y + , );
}
for (int i = ; i <= n; i++) {
add(s, i * , );
add(i * + , t, );
}
int maxflow = ;
int flow;
while (bfs()) {
while () {
flow = dinic(s, inf);
if (flow == )
break;
maxflow += flow;
}
}
for (int i = ; i <= n; i++) {
pre[(nx[i * ] - ) / ] = i;
} for (int i = ; i <= n; i++) {
if (vis[i])
continue;
if (pre[i] == -) {
int x = i;
while (x) {
vis[x] = ;
printf("%d ", x);
x = (nx[x * ] - ) / ;
}
printf("\n");
}
}
printf("%d\n", n - maxflow);
return ;
} /*
5 3
1 2 3 4 5
1 2 3
2 1 4
4 3 5
*/

Loj 6002 最小路径覆盖(最大流)的更多相关文章

  1. LibreOJ 6002 最小路径覆盖(最大流)

    题解:最小路径覆盖=总点数减去最大匹配数,拆点,按照每条边前一个点连源点,后一个点连汇点跑最大流,即可跑出最大匹配数,然后减一减就可以了~ 代码如下: #include<queue> #i ...

  2. [SDOI2010][bzoj1927] 星际竞速 [最小路径覆盖+费用流]

    题面 传送门 思路 仔细观察题目要求的东西,发现就是求一个最小路径覆盖,只不过可以跳跃(就是那个鬼畜的超级跳跃) 那么就直接上最小路径覆盖模版 对每个点,拆成两个点$X_i$和$Y_i$,建立超级源超 ...

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

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

  4. 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...

  5. Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)

    Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...

  6. [LOJ#6002]「网络流 24 题」最小路径覆盖

    [LOJ#6002]「网络流 24 题」最小路径覆盖 试题描述 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交)的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是  ...

  7. 【刷题】LOJ 6002 「网络流 24 题」最小路径覆盖

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

  8. LibreOJ #6002. 「网络流 24 题」最小路径覆盖

    #6002. 「网络流 24 题」最小路径覆盖 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...

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

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

随机推荐

  1. 关于Springboot找不到mapper.xml问题

    今天在写springboot项目时报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found),找 ...

  2. max count混合使用

    SELECT MAX(a1.人数) FROM (SELECT COUNT(category_id) AS "人数",category_id FROM course_category ...

  3. windows环境下使用python3.x自带的CGI服务器测试cgi脚本(转)

    1.在桌面上新建一个文件夹作为服务器目录文件夹(文件夹名称自定义,文件夹位置自定义),在www文件下再建一个文件夹,文件夹名为“cgi-bin”,须是这个文件名,其他试过不行(原因暂时未知)

  4. spring boot部署中executable的系统服务

    首先在pom.xml 中添加spring boot插件,并设置 <plugins> <plugin> <groupId>org.springframework.bo ...

  5. [bzoj4873] [洛谷P3749] [Shoi2017] 寿司餐厅

    Description Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个 代号ai和美味度di,i,不同种类的寿司有可能使用相同的代号.每种寿 ...

  6. shh登入不能自动执行.bashrc

    在linux 上新安装的anconda来管理软件,把环境变量放在home目录的.bashrc.结果每次开终端,不能直接使用conda.需要手动加环境变量. 用户登入后计算机执行了哪些文件 用户登录时b ...

  7. OpenCV在Mac下的部署 Java-IntelliJ IDEA

    目录 Xcode Command Line Xcode的证书许可 MacPorts的安装 环境变量的配置 安装OpenCV 安装确认 Idea配置 额外可能产生的问题 Xcode Command Li ...

  8. python 3 创建虚拟环境(Win10)

    python 3 创建虚拟环境(Win10) ①为什么要用虚拟环境? 为了解决一个环境多个项目的版本冲突问题 ②如何创建虚拟环境? 用窗口键+R来打开win10的运行窗口,然后在运行输入框输入cmd, ...

  9. JavaWeb高级编程(上)

    好久没更新了,发一篇以前记录学习的笔记. 面向读者:已经具有丰富的Java语言和Java SE平台知识的软件开发者和软件工程师. 预掌握知识: Internet.TCP.HTTP协议 HTML(5) ...

  10. GPU与CPU

    GPU与CPU CPU CPU,也就是中央处理器,结构主要包括控制器(指挥各部分工作).运算器(实现数据加工).寄存器.高缓以及数据/控制/状态总线.计算机的性能很大程度上依赖于CPU,CPU的功能包 ...