【Luogu】P2764最小路径覆盖(拆点求最大匹配)
这个……学了一条定理
最小路径覆盖=原图总点数-对应二分图最大匹配数
这个对应二分图……是什么呢?
就是这样
这是原图
这是拆点之后对应的二分图。
然后咱们的目标就是从这张图上跑出个最大流来,然后用原图的总点数减去就是答案。
至于记录路径……我发现有一个规律是可以在Dinic跑DFS的时候记。
别的我不知道了。因为我只会Dinic。
代码如下。
- #include<cstdio>
- #include<cstring>
- #include<cctype>
- #include<algorithm>
- #include<queue>
- #include<cstdlib>
- #define maxn 3000
- #define maxm 60000
- using namespace std;
- inline long long read(){
- long long num=,f=;
- char ch=getchar();
- while(!isdigit(ch)){
- if(ch=='-') f=-;
- ch=getchar();
- }
- while(isdigit(ch)){
- num=num*+ch-'';
- ch=getchar();
- }
- return num*f;
- }
- inline int count(int i){ return i&?i+:i-; }
- struct Edge{
- int next,to,val;
- }edge[maxm*];
- int head[maxn*],num;
- inline void addedge(int from,int to,int val){
- edge[++num]=(Edge){head[from],to,val};
- head[from]=num;
- }
- inline void add(int from,int to,int val){
- addedge(from,to,val);
- addedge(to,from,);
- }
- bool vis[maxn];
- int dfn[maxn];
- int list[maxn*];
- int Start,End;
- int road[maxn*];
- int n,m;
- bool flag;
- bool bfs(){
- memset(vis,,sizeof(vis));
- queue<int> q; dfn[Start]=; vis[Start]=; q.push(Start);
- while(!q.empty()){
- int from=q.front(); q.pop();
- for(int i=head[from];i;i=edge[i].next){
- int to=edge[i].to;
- if(vis[to]||edge[i].val<=) continue;
- vis[to]=;
- dfn[to]=dfn[from]+;
- q.push(to);
- }
- }
- return vis[End];
- }
- int dfs(int x,int val){
- //printf("%d %d\n",x,val);
- if(val==||x==End) return val;
- vis[x]=; int flow=;
- for(int &i=list[x];i;i=edge[i].next){
- int to=edge[i].to;
- if(vis[to]||dfn[to]!=dfn[x]+||edge[i].val<=) continue;
- int now=dfs(to,min(val,edge[i].val));
- val-=now; edge[i].val-=now; flow+=now; edge[count(i)].val+=now;
- if(val<=){
- road[x]=to;
- break;
- }
- }
- if(flow!=val) dfn[x]=-;
- return flow;
- }
- int maxflow(){
- int ans=;
- while(bfs()){
- memset(vis,,sizeof(vis));
- for(int i=Start;i<=End;++i) list[i]=head[i];
- int now=dfs(Start,0x7fffffff);
- if(!now) break;
- ans+=now;
- }
- return ans;
- }
- int main(){
- n=read(),m=read();End=n*+;
- for(int i=;i<=n;++i){
- add(Start,i,);
- add(i+n,End,);
- }
- for(int i=;i<=m;++i){
- int from=read(),to=read();
- add(from,to+n,);
- }
- int ans=maxflow();
- memset(vis,,sizeof(vis));
- for(int i=;i<=n;++i){
- if(road[i]==) continue;
- int now=i;
- while(now!=End&&now){
- printf("%d ",now>n?now-=n:now);
- int x=road[now]; road[now]=;
- now=x;
- }
- printf("\n");
- }
- printf("%d",n-ans);
- return ;
- }
【Luogu】P2764最小路径覆盖(拆点求最大匹配)的更多相关文章
- Luogu P2764 最小路径覆盖问题(二分图匹配)
P2764 最小路径覆盖问题 题面 题目描述 «问题描述: 给定有向图 \(G=(V,E)\) .设 \(P\) 是 \(G\) 的一个简单路(顶点不相交)的集合.如果 \(V\) 中每个顶点恰好在 ...
- luogu P2764 最小路径覆盖问题
题目描述 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任 ...
- LUOGU P2764 最小路径覆盖问题 (最小路径点覆盖)
解题思路 有向图最小路径点覆盖问题,有这样的结论就是有向图最小路径点覆盖等于n-拆点二分图中最大匹配.具体怎么证明不太知道..输出方案时找到所有左部未匹配的点一直走$match$就行了. #incl ...
- 【luogu P2764 最小路径覆盖问题】 模板
题目链接:https://www.luogu.org/problemnew/show/P2764 把每个点在左边建一遍右边建一遍,再加上源点汇点,跑最大流,n-最大流就是答案. #include &l ...
- 洛谷 P2764 最小路径覆盖问题 解题报告
P2764 最小路径覆盖问题 问题描述: 给定有向图\(G=(V,E)\).设\(P\) 是\(G\) 的一个简单路(顶点不相交)的集合.如果\(V\) 中每个顶点恰好在\(P\) 的一条路上,则称\ ...
- Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)
Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...
- P2764 最小路径覆盖问题 网络流重温
P2764 最小路径覆盖问题 这个题目之前第一次做的时候感觉很难,现在好多了,主要是二分图定理不太记得了,二分图定理 知道这个之后就很好写了,首先我们对每一个点进行拆点,拆完点之后就是跑最大流,求出最 ...
- 洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】
题目链接:https://www.luogu.org/problemnew/show/P2764 题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V ...
- 网络流二十四题之P2764 最小路径覆盖问题
题目描述 给定有向图 G=(V,E)G=(V,E) .设 PP 是 GG 的一个简单路(顶点不相交)的集合.如果 VV 中每个定点恰好在PP的一条路上,则称 PP 是 GG 的一个路径覆盖.PP中路径 ...
随机推荐
- 10.1 plan
1951 [Sdoi2010]古代猪文 Sdoi2010 Contest2 807 1928 1566 [NOI2009]管道取珠 806 1429 2756 [S ...
- DROP OPERATOR CLASS - 删除一个操作符类
SYNOPSIS DROP OPERATOR CLASS name USING index_method [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP OPER ...
- PAT (Basic Level) Practise (中文)- 1008. 数组元素循环右移问题 (20)
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… AN-1 A0 ...
- Servlet的引入(即加入Servlet)
今天讲的Servlet是根据上一章节<创建一个学生信息表,与页面分离>而结合. 一.看图分析 此模式有问题: 1.jsp需要呼叫javabean StudentService stuSer ...
- 关于SQL语言的初步认识
关于SQL语言的初步认识 1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义. 2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项. 3.一个表或者是一 ...
- 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题
笔者今天发现导入cocostudio的ui界面时,会有部分控件出现错位的现象,后来我看了一下源码,发现是部分控件是没有继承 Layout类,导致不能设置控件位置造成,原因可以看看cocos2dx 源码 ...
- cocos2dx 单张图片加密
cocos2dx 已经封装好读取加密的prv文件的方法,打开texturepacker,导入一张图片,在content protection中写入密钥,在texture format中选择prv格式 ...
- [vijos]P1514 天才的记忆
背景 神仙飞啊飞 描述 从前有个人名叫W and N and B,他有着天才般的记忆力,他珍藏了许多许多的宝藏.在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以 ...
- 在Keras中导入测试数据的方法
https://blog.csdn.net/ethantequila/article/details/80322425?utm_source=blogxgwz2
- windows10蓝屏page fault in nonpaged area
Windows系统最让人头疼的问题就是蓝屏了,总是出现得那么莫名其妙,而且造成原因也是千奇百怪的.所以,对于电脑蓝屏,系统迷也无法一次性讲清楚.前天,我的电脑就经历过这样的蓝屏page fault i ...