浏览代码

二分图、匈牙利算法

爱玲姐姐 5 年之前
父节点
当前提交
d5994ca54e
共有 1 个文件被更改,包括 54 次插入0 次删除
  1. 54 0
      L.cpp

+ 54 - 0
L.cpp

@@ -0,0 +1,54 @@
+#include <iostream>
+#include <cstring>
+#include <cstdio>
+#include <algorithm>
+using namespace std;
+const int MAXN = 110;
+bool Map[MAXN][MAXN];
+int link[MAXN];
+bool used[MAXN];
+int n,m,k;
+bool dfs(int u){
+    for(int i = 1; i <= m; i++){
+        if(Map[u][i] && used[i] == false ){
+            used[i] = true;
+            if(link[i] == -1 || dfs(link[i])){
+                link[i] = u;
+                return true;
+            }
+        }
+    }
+    return false;
+}
+int hungary(){
+    memset(link,-1,sizeof(link));
+    int ret = 0;
+    for(int i = 1; i <= n; i++){
+        memset(used,0,sizeof(used));
+        if(dfs(i))ret++;
+    }
+    return ret;
+}
+int main(){
+    int t = 0;
+    while(~scanf("%d %d %d",&n,&m,&k)){
+        memset(Map,0,sizeof(Map));
+        for(int i = 1; i <= k; i++){
+            int x,y;
+            scanf("%d %d",&x,&y);
+            Map[x][y] = 1;
+        }
+        int ans = hungary();
+        int cnt = 0;
+        for(int i = 1; i <= n; i++){
+            for(int j = 1; j <= m; j++){
+                if(Map[i][j] == 1){
+                    Map[i][j] = 0;
+                    if(ans > hungary())cnt++;
+                    Map[i][j] = 1;
+                }
+            }
+        }
+        printf("Board %d have %d important blanks for %d chessmen.\n",++t,cnt,ans);
+   }
+}