题意:问不能用k次戳破的气球有那些。
/************************************************ Author :DarkTong Created Time :2016/8/1 20:00:01 File Name :Hdu1498.cpp *************************************************/ #include <bits/stdc++.h> using namespace std; const int maxn = 100 + 10; vector<int> w[maxn]; int n, m; int Left[maxn]; bool used[maxn]; bool match(int i) { for(int j=0;j<w[i].size();++j) if(!used[w[i][j]]) { int v = w[i][j]; used[v] = true; if(!Left[v]||match(Left[v])) { Left[v] = 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 rec[maxn], nr, vis[maxn]; int ma[maxn][maxn]; int main() { int T, cas=1, k; while(scanf("%d%d", &n, &k)==2&&(n+k)) { for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { scanf("%d", &ma[i][j]); vis[ma[i][j]]=1; } if(k==n) { puts("-1"); continue; } nr=0; for(int z=1;z<=50;++z) { for(int i=0;i<maxn;++i) w[i].clear(); if(vis[z]) { for(int i=1;i<=n;++i) for(int j=1;j<=n;++j)if(ma[i][j]==z) { w[i].push_back(j); } if(hungary()>k) rec[nr++]=z; } } if(nr==0) puts("-1"); else { for(int i=0;i<nr;++i) printf("%d%c", rec[i], i==nr-1?'\n':' '); } } return 0; }
转载于:https://www.cnblogs.com/DarkTong/p/5727118.html