二分匹配_HDU_1281
2015-04-23 21:54
393 查看
姿势不对啊,先用行去选择列,最后扫一遍,每去一点,匹配一次,看是否为重要点
PS(建图方式是想到了,没想到用点遍历)最后还得一空,泪啊,在水一题压压惊!
PS(建图方式是想到了,没想到用点遍历)最后还得一空,泪啊,在水一题压压惊!
#include<iostream> #include<cstdio> #include<cstring> const int maxn = 105; using namespace std; int map[maxn][maxn],n,m,k; int link[maxn],visr[maxn],visc[maxn]; int Find(int x) { for(int i = 1; i <= m; i++) { if(map[x][i]) { if(!visr[x] && !visc[i]) { visr[x] = visc[i] = 1; if(link[i] == -1 || Find(link[i])) { link[i] = x; return 1; } else { visr[x] = visc[i] = 0; } } } } return 0; } int Math() { int cnt = 0; memset(link,-1,sizeof(link)); for(int i = 1; i <= n; i++) { memset(visr,0,sizeof(visr)); memset(visc,0,sizeof(visc)); if(Find(i)) cnt++; } return cnt; } int main() { int u,v,num=1,cnt,imp; while(scanf("%d%d%d",&n,&m,&k) != EOF) { memset(map, 0, sizeof(map)); cnt = imp = 0; while(k--) { scanf("%d%d",&u,&v); map[u][v] = 1; } cnt = Math(); for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { if(map[i][j]) { map[i][j] = 0; if(Math()<cnt) imp++; map[i][j] = 1; } } } printf("Board %d have %d important blanks for %d chessmen.\n",num++,imp,cnt); } return 0; }
相关文章推荐
- hdu 1281 棋盘游戏【二分匹配】
- hdu 1281 棋盘游戏 二分匹配
- HDU-1281(二分匹配_必要边)
- 二分图匹配——棋盘游戏 ( 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 棋盘游戏(二分匹配)
- HDU1281 二分匹配
- hdu 1281 二分匹配