L.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <algorithm>
  5. using namespace std;
  6. const int MAXN = 110;
  7. bool Map[MAXN][MAXN];
  8. int link[MAXN];
  9. bool used[MAXN];
  10. int n,m,k;
  11. bool dfs(int u){
  12. for(int i = 1; i <= m; i++){
  13. if(Map[u][i] && used[i] == false ){
  14. used[i] = true;
  15. if(link[i] == -1 || dfs(link[i])){
  16. link[i] = u;
  17. return true;
  18. }
  19. }
  20. }
  21. return false;
  22. }
  23. int hungary(){
  24. memset(link,-1,sizeof(link));
  25. int ret = 0;
  26. for(int i = 1; i <= n; i++){
  27. memset(used,0,sizeof(used));
  28. if(dfs(i))ret++;
  29. }
  30. return ret;
  31. }
  32. int main(){
  33. int t = 0;
  34. while(~scanf("%d %d %d",&n,&m,&k)){
  35. memset(Map,0,sizeof(Map));
  36. for(int i = 1; i <= k; i++){
  37. int x,y;
  38. scanf("%d %d",&x,&y);
  39. Map[x][y] = 1;
  40. }
  41. int ans = hungary();
  42. int cnt = 0;
  43. for(int i = 1; i <= n; i++){
  44. for(int j = 1; j <= m; j++){
  45. if(Map[i][j] == 1){
  46. Map[i][j] = 0;
  47. if(ans > hungary())cnt++;
  48. Map[i][j] = 1;
  49. }
  50. }
  51. }
  52. printf("Board %d have %d important blanks for %d chessmen.\n",++t,cnt,ans);
  53. }
  54. }