题目描述
西电ACM实验室是一个很和谐的实验室,有n个男生和m个女生组成(m>0),尽管表面大家都全心全意地为了荣誉而战,然而经过亮亮的深入调查,我们已经知道了有一些人三心二意:每天只有99%的时间花费在切题上,而还有1%的时间在想着某位或某几位异性!作为FFF团西电分部的部长,亮亮显然不能容许这种朝三暮四的情况。但是西电ACM实验室又是一个很开明的实验室,于是亮亮决定尽可能的撮合实验室的队员!
那么问题来了,亮亮最多能撮合多少对呢?
输入
多组数据,每组数据首先是两个整数,n,m表示男女生的人数(0<n,m<=500).
接下来是一个整数l(0<=l<=200000)表示亮亮搜集得到的关系
接下来是l行,每行是两个数u,v(0<=u<n,0<=v<m)
表示第u位男生和第v位女生有情况!
由于ACM实验室是个和谐的大家庭,因此不会出现同性恋。
输出
对于每组数据,输出一个整数,表示亮亮能撮合的对数。
--正文
二分图匹配模板
用匈牙利算法解决
话说给的样例有错吧,明明u<n的给个2。。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int n,m; int love[501][501]; // boy in the front int match[501]; bool visit[501]; bool dfs(int u){ int i; for (i=0;i<m;i++){ if (love[u][i] && !visit[i]){ visit[i] = true; if (match[i] == -1 || dfs(match[i])){ match[i] = u; return true; } } } return false; } int main(){ while (scanf("%d %d",&n,&m) != EOF){ int l; scanf("%d",&l); int i,j; memset(love,0,sizeof(love)); for (i=0;i<501;i++){ match[i] = -1; } for (i=1;i<=l;i++){ int u,v; scanf("%d %d",&u,&v); love[u][v] = 1; } int ans = 0; for (i=0;i<n;i++){ memset(visit,false,sizeof(visit)); if (dfs(i)) ans ++; } printf("%d\n",ans); } return 0; }
时间: 2024-10-28 16:18:40