博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解 P3386 【【模板】二分图匹配】
阅读量:6822 次
发布时间:2019-06-26

本文共 1598 字,大约阅读时间需要 5 分钟。

首先呢声明一下,本宝宝发这篇题解只是为了(goto a;)

个人还是比较喜欢跑dinic暴力跑最大流。。。竟然比匈牙利还快。。
如果说不懂网络流的~~蒟蒻~~大佬们。
可以看看(反正我就是在这篇文章看懂的)
好啦,言归正传。
a:本宝宝想解释一下为什么这道题可以用网络流水过233....
首先我们看看二分图的概念。标准概念是:
简单的说,一个图被分成了两部分,相同的部分没有边,那这个图就是二分图,二分图是特殊的图。(摘自)
如果你看不懂的话,那么请看某大佬给宝宝讲的时候的解释:
~~一群汉子和一群妹子匹配。没有基友也没百合,不能开后宫,这就是二分图。最大匹配就是求能组成的CP最多多少对~~  可能题解不过就是因为这句话233(逃~)
网络流最重要的是要建图!建图!建图!那么看看这道题怎么建图。
我们发现对于左边的n个点和右边的m个点。如果说最好的情况下。匹配的~~个~~对数是$min(m,n)$也就是说,我们左边尽可能的通过已有的边流到右半部分统计一下流到右半部分的容量最大值就是答案了(当然是要边的容量都是1的时候最简单了)。
所以我们将源点S设在左半部分左边,向左边所有的点连一条容量为1的边。汇点T设在右半部分的右边。从所有的右半部分的点连向汇点一条容量为1的边,暴力跑一边dicnic就好啦。
所以建边代码:

scanf("%d%d%d",&n1,&m1,&e1);    n=n1+m1+2;//源点编号为1,汇点编号为总点数+1    for(int i=1;i<=n1;i++)    {        add(1,i+1,1);//空过源点,所以i+1,这里在连接源点和左部点。        add(i+1,1,1);    }    for(int i=1;i<=e1;i++)    {        int u,v;//连已有的边        scanf("%d%d",&u,&v);        if(u<=n1&&v<=m1)        add(u+1,v+n1+1,1),        add(v+n1+1,u+1,1);    }    for(int i=1;i<=m1;i++)    {        add(i+n1+1,n,1);//连右部点和汇点        add(n,i+n1+1,1);    }

 

好啦完整代码奉上:

#include
#include
#include
#include
using namespace std;int n,m;int cnt=2;int alist[6000001];struct data{ int v;int next;int value;}edge[6000001];void add(int u,int v,int value){ edge[cnt].v=v; edge[cnt].value=value; edge[cnt].next=alist[u]; alist[u]=cnt++; return ;}int h[1000001];int q[1000001];//dicnic暴力参见上面提到的博客。bool bfs(){ int x,next; memset(h,-1,sizeof(h)); int head=0,tail=1; q[head]=1; h[1]=0; while(head

 

好啦这道题就先这样。对于要刷网络流的大佬们要是想练一练怎么见图的话是一个很好的选择。
然后想深入学习的同学可以看看最小割和转对偶图。之后做一下

转载地址:http://jjlzl.baihongyu.com/

你可能感兴趣的文章
Jsp动态生成表格
查看>>
MongoDB环境配置
查看>>
5_4 calvc
查看>>
Educational Codeforces Round 36 (Rated for Div. 2)
查看>>
深入理解javascript原型和闭包——从【自由变量】到【作用域链】
查看>>
Leetcode Sudoku Solver
查看>>
java多线程
查看>>
Navigator - BOM对象
查看>>
js中字符串的操作
查看>>
String类
查看>>
Hello Swift
查看>>
Codevs1029 遍历问题
查看>>
远程连接提示“为Administrator连接到现存会话发生错误(Id 0).操作成功”
查看>>
nginx配置ssl证书
查看>>
fastjson SerializerFeature详解
查看>>
spring源码读书笔记
查看>>
HDOJ-1015 Safecracker 【DFS】
查看>>
读书笔记-->Java经典编程300例--明日科技--清华大学出版社(第一版)
查看>>
如何在存储过程中自动添加分区
查看>>
普通分页笔记
查看>>