洛谷P3386-二分图最大匹配
可以用匈牙利跑,但是刚学完网络流,就试着用dinic跑了一发
题目链接:洛谷P3386
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <queue>
#include <functional>
#include <vector>
#include <stack>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
const int maxn=5000+50;
const int inf=0x3f3f3f3f;
const int MOD=998244353;
const int HASH=131;int n, m, cnt;//点,边,前向星计数
int head[maxn];//前向星
int level[maxn];//分层
int cur[maxn];//当前弧优化struct Edge
{int to;ll val;int next;
}edge[maxn*maxn];void add(int u,int v,int val)
{edge[cnt].to=v;edge[cnt].val=val;edge[cnt].next=head[u];head[u]=cnt++;
/*反向存边,在原边基础上+1*/edge[cnt].to=u;edge[cnt].val=0;edge[cnt].next=head[v];head[v]=cnt++;
}bool find_level(int s,int t)//源点和汇点,该bfs函数用来确定深度(层次)
{queue<int> q;memset(level,0,sizeof(level));for(int i=1;i<=n;i++){cur[i]=head[i];}int u=s;level[u]=1;q.push(u);while(!q.empty()){u=q.front();q.pop();for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;ll val=edge[i].val;if(!level[v]&&val)//层次不为0且容量不为0{level[v]=level[u]+1;q.push(v);}}if(level[t])//如果t有分层则继续下一步的处理{return true;}}return false;
}ll updata(int u,ll u_val,int t)//dfs更新
{if(u==t){return u_val;}ll used=0;//使用多少容量for(int &i=cur[u];~i;i=edge[i].next)//弧优化,神奇{int v=edge[i].to;ll val=edge[i].val;if(level[v]==level[u]+1&&val)//如果是相邻两层且有剩余容量{ll tmp=updata(v,min(u_val-used,val),t);//dfs递归,找最小容量edge[i].val-=tmp;edge[i^1].val+=tmp;used+=tmp;if(used==u_val) return used;//达到最大值,本条增广路搜索完毕}}if(used==0) level[u]=-1;//找不到增广路,减枝,节点作废return used;
}ll Dinic(int s,int t)
{ll ans=0;while(find_level(s,t)){ans+=updata(s,inf,t);}return ans;
}void init()
{cnt=0;memset(head,-1,sizeof(head));
}int main()
{init();int c;cin>>n>>m>>c;for(int i=1;i<=c;i++){int u,v;cin>>u>>v;u++,v=n+v+1;add(u,v,1);}for(int i=1;i<=n;i++)add(1,i+1,1);n++;for(int i=1;i<=m;i++)add(n+i,n+m+1,1);int s=1,t=n+m+1;n=t;cout<<Dinic(s,t)<<endl;return 0;
}
洛谷P3386-二分图最大匹配相关推荐
- 洛谷P3386:网络流之二分图匹配,最大流算法
二分图:我的理解是,对图中的点集,可分为两个集合U和V,使得两个集合之间存在通路,且集合内部不存在通路.如上图. 匹配:两两不含公共端点的边集合M 最大匹配:边数最多的匹配 完美匹配:最大匹配的匹配数 ...
- 洛谷 P3386 【模板】二分图匹配
洛谷 P3386 [模板]二分图匹配 题目 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行 ...
- P3386二分图最大匹配模版
传送门 声明几个定义: 1.二分图 对于一个图G=(V,E),若能将其点集分为两个互不相交的两个子集X.Y,使得X∩Y=∅,且对于G的边集V,若其所有边的顶点全部一侧属于X,一侧属于Y,则称图G为一个 ...
- 【洛谷P3386】【模板】二分图匹配【网络流】
题目大意: 题目链接:https://www.luogu.org/problemnew/show/P3386 求一个二分图的最大匹配. 思路: 二分图匹配的模板.可以用匈牙利做. 听说这道题卡Dini ...
- 洛谷P3386 【模板】二分图匹配
匈牙利算法模板 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstrin ...
- 二分图——洛谷P3386 【模板】二分图匹
https://www.luogu.org/problem/show?pid=3386 匈牙利算法不断寻找增广路: 尽可能让当前枚举的i可以匹配: 时间复杂度自己看代码: #include<cs ...
- 洛谷3386二分图模板
题目:https://www.luogu.org/problemnew/show/P3386 注意代码中标记处. #include<iostream> #include<cstdio ...
- 洛谷or牛客数据结构+算法
栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...
- 【洛谷】P3386 【模板】二分图最大匹配
题目地址: https://www.luogu.com.cn/problem/P3386 题目描述: 给定一个二分图,其左部点的个数为nnn,右部点的个数为mmm,边数为eee,求其最大匹配的边数.左 ...
最新文章
- 实现iOS图片等资源文件的热更新化(二):自定义的动态 imageNamed
- 错误:Script file ‘D:\software_install\Anaconda_install\Scripts\pip-script.py‘ is not present.完美解决方法
- 2021年河北高考生成绩排名查询,2021年河北高考成绩查询网站查分网址:http://www.hebeea.edu.cn/...
- 【Python】Pandas中的宝藏函数-rank()
- C#读取资源文件的两种方法及保存资源文件到本地
- c语言在文本每一行末尾追加字符串,c语言在末尾添加 C语言 在链表尾部添加节点...
- js中for循环调用回调函数,一直循环最后一个
- 异常将上下文初始化事件发送到类的侦听器实例_Java虚拟机从入门到入土之JVM的类加载机制
- 硬盘检测神器-HD Tune Pro/Hard Disk Sentinel
- ASP类计算机专业毕业设计题目
- Linux上Meson安装及使用
- 特斯拉灯光秀指南「GitHub 热点速览 v.22.01」
- 2010中国互联网哈哈榜:十大梁山好汉
- openwrt修改默认网关地址_非常详细的锐捷网关路由配置教程,适合新手小白
- dva 的一些特殊的写法
- c atol()函数_atol()函数以及C ++中的示例
- 海信E8H Mini LED 电视评测
- 小红书竞品分析_小红书与网易考拉海购竞品分析报告
- 1--MySQL基础知识内容
- swing重写右上角叉号