您的位置:首页 > 其它

自用二分图匹配模板

2017-11-05 23:33 169 查看

关于二分图匹配的讲解请看我之前的那篇博客。

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1005
using namespace std;
struct Edge{
int from,to;
};
inline int read(){
int num = 0;
char c;
bool flag = false;
while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
if (c == '-')
flag = true;
else
num = c - '0';
while (isdigit(c = getchar()))
num = num * 10 + c - '0';
return (flag ? -1 : 1) * num;
}
Edge edge[maxn*maxn];
int head[maxn*2];
int tot = 0;
void add_edge(int from,int to){
edge[++tot].from = head[from];
edge[tot].to = to;
head[from] = tot;
}
int n,m,e;
bool vis[maxn];
int match[maxn];
bool dfs_xyl(int x){
for (int i=head[x];i;i=edge[i].from){
int v = edge[i].to;
if (!vis[v]){
vis[v] = true;
if (!match[v]||dfs_xyl(match[v])){
match[v] = x;
return true;
}
}
}
return false;
}
int main(){
n = read();m = read();e = read();
for (int i=1;i<=e;i++){
int u,v;
u = read();v = read();
if (u > n || v > m)
continue;
add_edge(u,v);

}
int ans = 0;
for (int i=1;i<=n;++i){
memset(vis,false,sizeof(vis));
if(dfs_xyl(i))
ans++;
}
cout << ans << endl;
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: