P3386 【模板】二分图最大匹配
生活随笔
收集整理的這篇文章主要介紹了
P3386 【模板】二分图最大匹配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
P3386 【模板】二分圖最大匹配
提交71.75k
通過27.33k
時間限制1.00s
內存限制512.00MB
提交答案加入題單
復制題目
題目提供者HOOCCOOH
難度普及+/提高
歷史分數100
?提交記錄??查看題解
標簽
O2優化
?查看算法標簽
進入討論版
相關討論
?查看討論
推薦題目
?查看推薦
?洛谷推薦關閉
?展開
題目描述
給定一個二分圖,其左部點的個數為?nn,右部點的個數為?mm,邊數為?ee,求其最大匹配的邊數。
左部點從?11?至?nn?編號,右部點從?11?至?mm?編號。
輸入格式
輸入的第一行是三個整數,分別代表?nn,mm?和?ee。
接下來?ee?行,每行兩個整數?u, vu,v,表示存在一條連接左部點?uu?和右部點?vv?的邊。
輸出格式
輸出一行一個整數,代表二分圖最大匹配的邊數。
輸入輸出樣例
輸入 #1復制
1 1 1 1 1輸出 #1復制
1輸入 #2復制
4 2 7 3 1 1 2 3 2 1 1 4 2 4 1 1 1輸出 #2復制
2說明/提示
數據規模與約定
對于全部的測試點,保證:
- 1 \leq n, m \leq 5001≤n,m≤500。
- 1 \leq e \leq 5 \times 10^41≤e≤5×104。
- 1 \leq u \leq n1≤u≤n,1 \leq v \leq m1≤v≤m。
不保證給出的圖沒有重邊。
【AC代碼】
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10; const int INF=0x3f3f3f3f; inline int read() {char ch=getchar();int n=0,m=1;while(ch<'0'||ch>'9'){if(ch=='-')m=-1;ch=getchar();}while(ch>='0'&&ch<='9')n=(n<<3)+(n<<1)+ch-48,ch=getchar();return n*m; } void write(int n) {if(n>9)write(n/10);putchar(n%10+'0'); } int n,m,p,d[N],head[N],to[N],ne[N],id,ans; bool vis[N]; void add(int x,int y) {to[++id]=y,ne[id]=head[x],head[x]=id; } bool find(int u) {vis[u]=1;for(int i=head[u];i;i=ne[i]){int v=to[i];if(vis[d[v]])continue;if(!d[v]||find(d[v])){d[v]=u;return true;}}return false; } int main(int argc,char **argv) {n=read(),m=read(),p=read();while(p--){int x,y;x=read(),y=read();add(x,y);}for(int i=1;i<=n;i++){memset(vis,0,sizeof vis);if(find(i))ans++;}write(ans);return 0; }總結
以上是生活随笔為你收集整理的P3386 【模板】二分图最大匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络安全:包过滤防火墙和代理防火墙(应用
- 下一篇: 蓝牙技术简介