刚开始不理解为什么是最大二分匹配的题,结果看到了discuss的一句话:最小点覆盖=最大匹配算法 其实就是匈牙利,然后一切都解决了~~
注意初始状态为0时不需要restart,要不会wa
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int N, M, K;
int map[110][110];
int vis[110];
int result[110];
void init()
{
memset(map, 0, sizeof(map));
memset(result, 0, sizeof(result));
}
int find(int x)
{
int i;
for(i = 0; i < M; i++)
{
if(!vis[i] && map[x][i])
{
vis[i] = 1;
if(!result[i] || find(result[i]))
{
result[i] = x;
return 1;
}
}
}
return 0;
}
int main()
{
int i, tmp, a, b, ans;
while(scanf("%d", &N) && N)
{
scanf("%d%d", &M, &K);
init();
for(i = 0; i < K; i++)
{
scanf("%d%d%d", &tmp, &a, &b);
if(a && b)
map[a][b] = 1;
}
ans = 0;
for(i = 0; i < N; i++)
{
memset(vis, 0, sizeof(vis));
if(find(i))
ans++;
}
printf("%d\n", ans);
}
return 0;
}