2063 過山車(二分圖匹配)
阿新 • • 發佈:2019-02-05
題目連結:
題解:
二分圖匹配模板題。
AC程式碼:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int V[505][505];
int check[1000];
int matching[1000];
int n,m;
bool dfs(int u)
{
int i;
for(i = 1; i <= m; i++)
{
if(check[i] || V[u][i] != 1 )//男孩已經被選走了或者這倆人互相不喜歡
continue;
check[i] = 1;
if(matching[i] == -1 || dfs(matching[i]))//利用dfs和增廣路原理,觀察男孩是否可以騰出位置或者沒有被選走
{
matching[i] = u;//配個對
return true;
}
}
return false;
}
int solve(int n_left)
{
int i, ans = 0;
memset (matching, -1 ,sizeof(matching));
for(i = 1; i <= n_left; i++)
{
memset(check, 0 ,sizeof(check));
if(dfs(i))
ans++;
}
return ans;
}
int main()
{
int k ;
while(cin >> k)
{
if(k == 0)break;
memset(V,0,sizeof(V));
cin >> n >> m;
while(k--)
{
int a,b;
cin >> a >> b;
V[a][b] = 1;
}
cout << solve(n) <<endl;
}
return 0;
}