P3386 【模板】二分圖匹配【二分圖 最大匹配】
阿新 • • 發佈:2018-12-03
題目背景
二分圖
題目描述
給定一個二分圖,結點個數分別為n,m,邊數為e,求二分圖最大匹配數
輸入格式
第一行,n,m,e
第二至e+1行,每行兩個正整數u,v,表示u,v有一條連邊
輸出格式
共一行,二分圖最大匹配
輸入樣例
1 1 1
1 1
輸出樣例
1
說明
n,m≤1000,1≤u≤n,1≤v≤m
因為資料有坑,可能會遇到 v>m 的情況。請把 v>m 的資料自覺過濾掉。
演算法:二分圖匹配
問題連結: P3386 【模板】二分圖匹配
解題思路:二分圖模板題,使用匈牙利演算法
AC的C++程式
#include<iostream> #include<cstring> #include<vector> using namespace std; const int N=2005; vector<int>g[N];//鄰接表 bool vis[N];//標記點集Y中的結點是否被訪問 int link[N];//記錄點集Y中的結點y與點集X中的結點x相連 bool find(int x) { for(int i=0;i<g[x].size();i++) { int y=g[x][i]; if(!vis[y]) { vis[y]=true; if(link[y]==-1||find(link[y])) { link[y]=x; return true; } } } return false; } int main() { int n,m,e,u,v; scanf("%d%d%d",&n,&m,&e); while(e--) { scanf("%d%d",&u,&v); if(u>n||v>m) continue; v+=n; g[u].push_back(v); g[v].push_back(u); } memset(link,-1,sizeof(link)); int ans=0; for(int i=1;i<=n;i++) { memset(vis,false,sizeof(vis)); if(find(i)) ans++; } printf("%d\n",ans); return 0; }