[luoguP2764] 最小路径覆盖问题(最大流 || 二分图最大匹配)
可惜洛谷上没有special judge,不然用匈牙利也可以过的,因为匈牙利在增广上有一个顺序问题,所以没有special judge就过不了了。
好在这个题的测试数据比较特殊,如果是网络流的话按照顺序加边,就可以过。
最小不相交路径覆盖 = 总点数 - 最大匹配数
——代码
- #include <queue>
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #define N 20001
- #define min(x, y) ((x) < (y) ? (x) : (y))
- #define max(x, y) ((x) > (y) ? (x) : (y))
- int n, m, cnt, sum, s, t;
- int head[N], belong[N], to[N], next[N], val[N], suc[N], cur[N], dis[N];
- inline int read()
- {
- int x = , f = ;
- char ch = getchar();
- for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
- for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
- return x * f;
- }
- inline void add(int x, int y, int z)
- {
- to[cnt] = y;
- val[cnt] = z;
- next[cnt] = head[x];
- head[x] = cnt++;
- }
- inline bool bfs()
- {
- int i, u, v;
- std::queue <int> q;
- memset(dis, -, sizeof(dis));
- q.push(s);
- dis[s] = ;
- while(!q.empty())
- {
- u = q.front(), q.pop();
- for(i = head[u]; i ^ -; i = next[i])
- {
- v = to[i];
- if(val[i] && dis[v] == -)
- {
- dis[v] = dis[u] + ;
- if(v == t) return ;
- q.push(v);
- }
- }
- }
- return ;
- }
- inline int dfs(int u, int maxflow)
- {
- if(u == t) return maxflow;
- int i, v, d, ret = ;
- for(i = cur[u]; i ^ -; i = next[i])
- {
- v = to[i];
- if(val[i] && dis[v] == dis[u] + )
- {
- d = dfs(v, min(val[i], maxflow - ret));
- ret += d;
- cur[u] = i;
- val[i] -= d;
- val[i ^ ] += d;
- if(d) suc[u] = v - n;
- if(ret == maxflow) return ret;
- }
- }
- return ret;
- }
- int main()
- {
- int i, j, x, y, now;
- n = read();
- m = read();
- s = , t = (n << ) + ;
- memset(head, -, sizeof(head));
- for(i = ; i <= m; i++)
- {
- x = read();
- y = read();
- add(x, y + n, );
- add(y + n, x, );
- }
- for(i = ; i <= n; i++)
- {
- add(s, i, );
- add(i, s, );
- add(i + n, t, );
- add(t, i + n, );
- }
- while(bfs())
- {
- for(i = s; i <= t; i++) cur[i] = head[i];
- sum += dfs(s, 1e9);
- }
- for(i = ; i <= n; i++)
- if(suc[i])
- {
- now = i;
- while(now)
- {
- printf("%d ", now);
- x = suc[now];
- suc[now] = ;
- now = x;
- }
- puts("");
- }
- printf("%d\n", n - sum);
- return ;
- }
[luoguP2764] 最小路径覆盖问题(最大流 || 二分图最大匹配)的更多相关文章
- LuoguP2764 最小路径覆盖问题(最大流)
题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...
- uva1201 DAG 最小路径覆盖,转化为 二分图
大白例题P356 你在一座城市里负责一个大型活动的接待工作.你需要去送m个人从出发地到目的地,已知每个人的出发时间出发地点,和目的地点,你的任务是用尽量少的出租车送他们,使得每次出租车接客人,至少能提 ...
- 【Luogu】P2764最小路径覆盖(拆点求最大匹配)
题目链接 这个……学了一条定理 最小路径覆盖=原图总点数-对应二分图最大匹配数 这个对应二分图……是什么呢? 就是这样 这是原图 这是拆点之后对应的二分图. 然后咱们的目标就是从这张图上跑出个最大流来 ...
- [题解] LuoguP2764 最小路径覆盖问题
传送门 好久没做网络流方面的题发现自己啥都不会了qwq 题意:给一张有向图,让你用最少的简单路径覆盖所有的点. 考虑这样一个东西,刚开始,我们有\(n\)条路径,每条路径就是单一的一个点,那么我们的目 ...
- P2764 [网络流24题]最小路径覆盖问题[最大流]
地址 这题有个转化,求最少的链覆盖→即求最少联通块. 设联通块个数$x$个,选的边数$y$,点数$n$个 那么有 $y=n-x$ 即 $x=n-y$ 而n是不变的,目标就是在保证每个点入度.出度 ...
- P2764 最小路径覆盖问题 题解(二分图)
建图思路很明确,拆点跑最大匹配,但这明显是个二分图的题题解居然只有一篇匈牙利算法. 发一种和之前那篇匈牙利思路略有不同的题解. 本题的难点就是如何输出,那么我们不妨在建图的时候加入一个原则,即:连边时 ...
- 洛谷P2764 最小路径覆盖问题(最大流)
传送门 先说做法:把原图拆成一个二分图,每一个点被拆成$A_i,B_i$,若原图中存在边$(u,v)$,则连边$(A_u,B_v)$,然后$S$对所有$A$连边,所有$B$对$T$连边,然后跑一个最大 ...
- bzoj 2044 三维导弹拦截——DAG最小路径覆盖(二分图)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2044 还以为是CDQ.发现自己不会三维以上的…… 第一问可以n^2.然后是求最长不下降子序列 ...
- HDU 3861 The King’s Problem 强连通分量 最小路径覆盖
先找出强连通分量缩点,然后就是最小路径覆盖. 构造一个二分图,把每个点\(i\)拆成两个点\(X_i,Y_i\). 对于原图中的边\(u \to v\),在二分图添加一条边\(X_u \to Y_v\ ...
随机推荐
- Android(java)学习笔记122:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)
之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播: 1. 我们首先了解一下有序广播和无序广播区别和联系? (1)有序广播> 接受者有优先级, ...
- 多并发下 SimpleDateFormat 出现错误
private static String time = "2019-01-11 11:11:11"; private static long timestamp = 154717 ...
- EditPlus 3.7激活码注册码
EditPlus3.7激活教程以及EditPlus3.7激活码使用方法 EditPlus是一款功能齐全的文字编辑器,搭配其他的插件还可以实现很多的功能,还可以编辑和编译Java,调试程序等,主要用来打 ...
- 怎么在WEBSTORM中设置代码模板 Live Templates
怎么在WEBSTORM中设置代码模板 Live Templates setting 里面 https://www.cnblogs.com/xinzaimengzai/p/9938464.html
- mac层到ath9k层,ath9k层到硬件层
如上图,整个 mac 层分成两个部分——UMAC 和 LMAC.LMAC 分成 MAC 下半部分和硬件抽象层. 硬件抽象层和ath9k层的连接 在hw.h中的函数struct ath_hw_ops() ...
- OC和C++的混用1
//Objective-C类 /*在混用之前需要做一步非常重要的事:不是代码而是编译器选项,在做混合编译之前一定要把编译器的Compile Sources As选项改为Objective C++. 修 ...
- 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic
本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
- Linux - which xxx - 查找执行的命令所在的路径
Linux 下,我们常使用 cd ,grep,vi 等命令,有时候我们要查到这些命令所在的位置,如何做呢? Linux 下有2个命令可完成该功能:which ,whereis which 用来查看当 ...
- k8s资源指标API及metrics-server资源监控
简述: 在k8s早期版本中,对资源的监控使用的是heapster的资源监控工具. 但是从 Kubernetes 1.8 开始,Kubernetes 通过 Metrics API 获取资源使用指标,例如 ...
- 03Qt信号与槽(2)
1. 元对象工具 元对象编译器 MOC(meta object compiler)对 C++ 文件中的类声明进行分析并产生用于初始化元对象的 C++ 代码,元对象包含全部信号和槽的名字及指向这些函 ...