洛谷:P3386
题目背景
二分图
题目描述
给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数
输入输出格式
输入格式:
第一行,n,m,e
第二至e+1行,每行两个正整数u,v,表示u,v有一条连边
输出格式:
共一行,二分图最大匹配
输入输出样例
输入样例#1:
1 1 1 1 1
输出样例#1:
1
邻接矩阵(老码风)
#include <cstdio> #include <iostream> #include <algorithm> #include <cstdlib> #include <cstring> using namespace std; const int maxn(1005); int ans; int n,m,e; bool vis[maxn][maxn]; bool use[maxn]; int matched[maxn]; inline bool dfs(int); int main(){ scanf("%d%d%d",&n,&m,&e); for(int i=1;i<=e;++i){ int x,y; scanf("%d%d",&x,&y); vis[x][y]=true; } for(int i=1;i<=n;++i){ memset(use,false,sizeof use); if(dfs(i)) ans++; } printf("%d\n",ans); return 0; } inline bool dfs(int x){ for(int i=1;i<=m;++i){ if(vis[x][i]&&!use[i]){ use[i]=true; if(!matched[i]||dfs(matched[i])){ matched[i]=x; return true; } } } return false; }
邻接矩阵(新码风)
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int MAXM = 1e8; const int MAXN = 1005; struct node { int to,next; }; node e[MAXM]; bool used[MAXN]; int head[MAXN],cnt,n,m,ee,Ans,Matched[MAXN]; void add(int from,int to) { e[++cnt].next = head[from]; e[cnt].to = to; head[from] = cnt; } inline bool dfs(int u) { for(int i = head[u];i;i = e[i].next) { int v = e[i].to; if(!used[v]) { used[v] = true; if(!Matched[v] || dfs(Matched[v])) { Matched[v] = u; return true; } } } return false; } int main() { cin >> n >> m >> ee; for(int i = 1;i <= ee;++i) { int from,to; cin >> from >> to; if(from > n or to > m) continue; add(from,to); } for(int i = 1;i <= n;++i) { memset(used,false,sizeof used); if(dfs(i)) Ans++; } cout << Ans << endl; return 0; }
文章评论