您的位置:首页 > 其它

HDU 1281 棋盘游戏(最大二分匹配)

2013-05-05 16:40 246 查看
还是一样,熟悉模板!然后就是先这个样的题目,同一行活同一列只能有一个子的题目,可以用二分匹配来做,也就是每一行只能陪一列,不能重复!

这道题,也是一个一个点试出来的,看看有没有等价边!

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int const N = 110;
int n, m, k, g

;
int cx
, cy
;
bool used
;

int dfs( int u ) {
for ( int v = 1; v <= m; ++v )
if ( g[u][v] && !used[v] ) {
used[v] = true;
if ( cy[v] == -1 || dfs(cy[v]) ) {
cy[v] = u;
cx[u] = v;
return true;
}
}
return false;
}
int match()
{
int res = 0;
memset(cx, -1, sizeof(cx));
memset(cy, -1, sizeof(cy));
for ( int i = 1; i <= n; ++i ) {
memset( used, 0, sizeof(used));
if ( dfs(i) ) res++;
}
return res;
}
int main()
{
int icase = 1;
while ( scanf("%d%d%d", &n, &m, &k) == 3 ) {
memset(g, 0, sizeof(g));
while (k--) {
int u, v;
scanf("%d%d", &u, &v);
g[u][v] = 1;
}
int ans = match(), res = 0;
for ( int i = 1; i <= n; ++i )
for ( int j = 1; j <= m; ++j ) {
if ( g[i][j] == 1 ) {
g[i][j] = 0;
if ( ans > match() ) res++;
g[i][j] = 1;
}
}
printf("Board %d have %d important blanks for %d chessmen.\n", icase++, res, ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: