杭电oj-2063 过山车
这道题是一道典型的匈牙利算法题,关于匈牙利算法,这里做了详细的解释:https://blog.csdn.net/dark_scope/article/details/8880547
总结下来就是“先到先得,能让则让”。
但是实际操作过程中,程序中如果使用cin和cout便会WA,替换为scanf和printf便ac,不得其解。
//AC代码
#include<iostream>
using namespace std;
const int N = 505;
int cp[N][N],used[N],boy[N];
int k,m,n;
bool Hungary(int x) {
for (int j = 1; j <= n; j++)
{
if (cp[x][j] && !used[j]) {
used[j] = true;
if (!boy[j] || Hungary(boy[j])) {
boy[j] = x;
return true;
}
}
}
return false;
}
int main() {
while (scanf("%d", &k) != EOF && k)
{
scanf("%d%d", &m, &n);
memset(cp, 0, sizeof(cp));
memset(boy, 0, sizeof(boy));
for (int i = 0; i < k; i++)
{
int x, y;
scanf("%d%d", &x, &y);
cp[x][y] = 1;
}
int ans = 0;
for (int i = 1; i <= m; i++)
{
memset(used, false, sizeof(used));
if (Hungary(i)) {
ans++;
}
}
printf("%d\n", ans);
}
return 0;
}
//WA代码
/*#include<iostream>
using namespace std;
const int N = 505;
int cp[N][N],used[N],boy[N];
int k,m,n;
bool Hungary(int x) {
for (int j = 1; j <= n; j++)
{
if (cp[x][j] && !used[j]) {
used[j] = true;
if (!boy[j] || Hungary(boy[j])) {
boy[j] = x;
return true;
}
}
}
return false;
}
int main() {
while (scanf("%d", &k) != EOF && k)
{
cin >> n >> m;
memset(cp, 0, sizeof(cp));
memset(boy, 0, sizeof(boy));
for (int i = 0; i < k; i++)
{
int x, y;
cin >> x >> y;
cp[x][y] = 1;
}
int ans = 0;
for (int i = 1; i <= m; i++)
{
memset(used, false, sizeof(used));
if (Hungary(i)) {
ans++;
}
}
cout << ans << endl;
}
return 0;
}
*/