P3386 【模板】二分图匹配
2017-07-25 09:12
357 查看
题目背景
二分图题目描述
给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数输入输出格式
输入格式:第一行,n,m,e
第二至e+1行,每行两个正整数u,v,表示u,v有一条连边
输出格式:
共一行,二分图最大匹配
输入输出样例
输入样例#1:1 1 1 1 1
输出样例#1:
1
说明
n,m<=1000,1<=u<=n,1<=v<=m因为数据有坑,可能会遇到v>m的情况。请把v>m的数据自觉过滤掉。
算法:二分图匹配
为什么邻接表A不了,,,,
好奇怪,,
换上邻接矩阵秒过,,,,
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int MAXN=1001; void read(int & n) { char c='+';int x=0;bool flag=0; while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;} while(c>='0'&&c<='9')x=x*10+(c-48),c=getchar(); flag==1?n=-x:n=x; } struct node { int u,v,nxt; }edge[MAXN]; int head[MAXN]; int num=1; int n,m,e; void add_edge(int x,int y) { edge[num].u=x; edge[num].v=y; edge[num].nxt=head[x]; head[x]=num++; } int vis[MAXN]; int link[MAXN]; int ans=0; int map[MAXN][MAXN]; bool dfs(int x) { /*for(int i=head[x];i!=-1;i=edge[i].nxt) { if(!vis[edge[i].v]) { vis[edge[i].v]=1; if(!link[edge[i].v]||dfs(link[edge[i].v])) { link[edge[i].v]=x; return 1; } } } return 0;*/ for(int i=1;i<=m;i++) { if(map[x][i]&&!vis[i]) { vis[i]=1; if(!link[i]||dfs(link[i])) { link[i]=x; return 1; } } } return 0; } int main() { memset(head,-1,sizeof(head)); read(n);read(m);read(e); for(int i=1;i<=e;i++) { int x,y; read(x);read(y); if(x>n||y>m)continue; //add_edge(x,y); map[x][y]=1; } for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } printf("%d",ans); return 0; }
相关文章推荐
- AC日记——【模板】二分图匹配 洛谷 P3386
- 洛谷—— P3386 【模板】二分图匹配
- P3386 【模板】二分图匹配(匈牙利&最大流)
- 洛谷P3386 【模板】二分图匹配
- 【模板】匈牙利算法 二分图匹配 (模版题:洛谷P3386)
- 洛谷P3386 【模板】二分图匹配
- 洛谷 P3386 【模板】二分图匹配
- 洛谷 P3386【模板】二分图匹配
- P3386 【模板】二分图匹配 Ek 与 dinic
- 洛谷 P3386 【模板】二分图匹配
- P3386 【模板】二分图匹配(网络流与线性规划24题01飞行员配对方案问题)
- 洛谷 P3386 【模板】二分图匹配
- 洛谷 P3386 【模板】二分图匹配
- 洛谷 P3386 【模板】二分图匹配 Dinic版
- P3386 【模板】二分图匹配
- 洛谷 P3386 【模板】二分图匹配
- 洛谷P3386【模板】二分图匹配
- C++模板:二分图匹配
- 二分图匹配模板
- 二分图匹配问题(——模板习题与总结)