HDU-2119-Matrix(最大匹配)
阿新 • • 發佈:2019-05-16
ace memset using dfs -m link 個數 can class
鏈接:https://vjudge.net/problem/HDU-2119#author=Smilencer
題意:
眾所周知,tyz是一個寫bug小能手,以至於如果沒有隊友的幫助,就ac不了程序。
今天可憐的XJL又被抓來出數據debug了,你要幫助他以最少的樣例消滅所有程序的bug
數據以矩陣的形式表示出來,整個矩陣中只包含0,1兩個數。其中1代表一個bug。
已知每出一個樣例可以消滅一行或者一列的bug,即把一行或一列所有的1變成0。
你的任務是求出最少需要找多少個樣例才能使得整個程序沒有bug,即矩陣中的1全部被清除
思路:
x,y建立二分圖。
代碼:
#include <iostream> #include <memory.h> #include <string> #include <istream> #include <sstream> #include <vector> #include <stack> #include <algorithm> #include <map> #include <queue> #include <math.h> #include <cstdio> #include <set> #include <iterator> #include <cstring> using namespace std; typedef long long LL; const int MAXN = 5e3+10; int Next[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; vector<int> G[MAXN]; int Map[110][110]; int Link[MAXN], Vis[MAXN]; int n, m, k; bool Dfs(int x) { for (int node = 1;node <= m;node++) { if (Map[x][node] && Vis[node] == 0) { Vis[node] = 1; if (Link[node] == -1 || Dfs(Link[node])) { Link[node] = x; return true; } } } return false; } int Solve() { memset(Link, -1, sizeof(Link)); int cnt = 0; for (int i = 1;i <= n;i++) { memset(Vis, 0, sizeof(Vis)); if (Dfs(i)) cnt++; } return cnt; } int main() { while (~scanf("%d", &n) && n) { scanf("%d", &m); for (int i = 1;i <= n;i++) for (int j = 1;j <= m;j++) scanf("%d", &Map[i][j]); int cnt = Solve(); printf("%d\n", cnt); } return 0; }
HDU-2119-Matrix(最大匹配)