题意:在给定位置的棋盘下放最多的车,但它们不互相攻击,再稳有多少个位置是必须放车才会使结果最优。
/************************************************ Author :DarkTong Created Time :2016/8/1 11:39:01 File Name :hdu_1281.cpp *************************************************/ //#include <bits/stdc++.h> #include <cstring> #include <cstdio> using namespace std; const int maxn = 100 + 10; int w[maxn][maxn], n, m; int Left[maxn]; bool used[maxn]; bool match(int i) { for(int j=1;j<=m;++j) if(w[i][j]&&!used[j]) { used[j] = true; if(!Left[j]||match(Left[j])) { Left[j] = i; return true; } } return false; } //返回最大匹配数 int hungary() { int res=0; memset(Left, 0, sizeof(Left)); for(int i=1;i<=n;++i) { memset(used, 0, sizeof(used)); if(match(i)) res++; } return res; } int e[maxn][2]; int main() { int T, cas=1, k; while(scanf("%d%d%d", &n, &m, &k)==3) { memset(w, 0, sizeof(w)); int r, c; for(int i=1;i<=k;++i) { scanf("%d%d", &r, &c); w[r][c]=1; } int en, tans, ans; ans = tans = hungary(); en=0; for(int i=1;i<=n;++i) { if(!Left[i]) continue; e[en][0]=Left[i], e[en][1]=i; en++; } for(int i=0;i<en;++i) { w[e[i][0]][e[i][1]]=0; if(hungary()==tans) ans--;//, printf("%d %d", e[i][0], e[i][1]); w[e[i][0]][e[i][1]]=1; } printf("Board %d have %d important blanks for %d chessmen.\n", cas++, ans, tans); } return 0; }
转载于:https://www.cnblogs.com/DarkTong/p/5725403.html