HDU 1281 棋盘游戏-二分匹配
2016-08-02 20:38
363 查看
在棋盘里放尽可能多的车,让他们不能互相攻击,有一些格子不能放车,但不影响他们互相攻击。问最多能放多少个车,并且求出有多少个重要点,重要点就是如果不在这个点上放车,就不能尽可能的多放棋子。
先求出最大匹配数,然后枚举去掉每一个格子,如果得到的匹配数小于最大匹配数,重要点就多一个。
先求出最大匹配数,然后枚举去掉每一个格子,如果得到的匹配数小于最大匹配数,重要点就多一个。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn = 1550; int e[maxn][maxn],match[maxn],book[maxn]; int n,m,k; struct node { int x,y; }p[10010]; int dfs(int u) { int i; for(i=1;i<=m;i++) { if(book[i]==0 && e[u][i] == 1) { book[i] = 1; if(match[i] ==0 || dfs(match[i])) { match[i] = u; return 1; } } } return 0; } int solve() { int sum = 0; memset(match,0,sizeof(match)); for(int i=1;i<=n;i++) { memset(book,0,sizeof(book)); if(dfs(i)) sum++; } return sum; } int main(void) { int i,j,k,t1,t2; int c = 1; while(scanf("%d%d%d",&n,&m,&k)==3) { memset(e,0,sizeof(e)); for(i=0;i<k;i++) { scanf("%d%d",&t1,&t2); e[t1][t2] = 1; p[i].x = t1; p[i].y = t2; } int ans = solve(); int cnt = 0; for(i=0;i<k;i++) { e[p[i].x][p[i].y] = 0; if(solve()<ans) cnt++; e[p[i].x][p[i].y] = 1; } printf("Board %d have %d important blanks for %d chessmen.\n",c++,cnt,ans); } }
相关文章推荐
- 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 棋盘游戏【二分匹配+暴力枚举】
- HDU1281-棋盘游戏-二分匹配与增广链
- HDU 1281 棋盘游戏 二分匹配 匈牙利算法
- HDU 1281(棋盘游戏)二分匹配+暴力
- HDU 1281 棋盘游戏(最大二分匹配)
- hdu 1281 棋盘游戏 (二分匹配)
- hdu 1281棋盘游戏(二分匹配)