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); } }
相关文章推荐
- HDU 1281 棋盘游戏(匈牙利算法 二分最大匹配)
- HDU 1281 — 棋盘游戏 最大匹配
- HDU_1281 棋盘游戏 (二分图的最大匹配)
- hdu1281 棋盘游戏 (最大匹配)
- hdu 1281 棋盘游戏 最大匹配(经典题)
- hdu 1281 棋盘游戏(二分匹配)
- Hdu 1281 棋盘游戏 (二分匹配)
- hdu 1281 棋盘游戏 (二分匹配)
- HDU 1281 棋盘游戏(二分匹配)
- HDU 1281 棋盘游戏 二分图最大匹配 + 枚举
- HDU 1281 棋盘游戏 (二分图的最大匹配)
- hdu 1281 棋盘游戏(最大匹配·匈牙利)
- HDU 1281 棋盘游戏(二分匹配 与 删边)
- [HDU 1281] 棋盘游戏 最大匹配
- hdu 1281 棋盘游戏 二分匹配
- HDU 1281 棋盘游戏(二分图最大匹配:关键边)
- HDU 1281 棋盘游戏 最大匹配+枚举
- HDU 1281(棋盘游戏)二分匹配+暴力
- hdu 1281 棋盘游戏(二分匹配)
- hdu 1281 棋盘游戏(枚举,二分图最大匹配)