HDU 1045 Fire Net(二分圖最大匹配)
阿新 • • 發佈:2019-02-08
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<string> #include<set> #include<ctime> #define eps 1e-6 #define LL long long #define pii pair<int, int> //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const int MAXN = 1505;//這個值要超過兩邊個數的較大者,因為有linker int linker[MAXN]; bool used[MAXN]; vector<int> map[MAXN]; int uN, uV; bool dfs(int u) { for (int i = 0; i < map[u].size(); i++) { int v = map[u][i]; if(!used[v]) { used[v] = 1; if(linker[v]==-1 || dfs(linker[v])) { linker[v] = u; return true; } } } return false; } int hungary() { int res = 0; memset(linker, -1, sizeof(linker)); int u; for (u = 0; u < uN; u++) { memset(used, 0, sizeof(used)); if(dfs(u)) res++; } return res; } int n; char G[5][5]; int idX[5][5], idY[5][5]; int main() { //freopen("input.txt", "r", stdin); while(cin>>n && n) { for (int i = 1; i <= n; i++) { char row[10]; scanf("%s", row); for (int j = 1; j <= n; j++) { G[i][j] = row[j-1]; } } uN = uV = 0; for(int i = 1; i <= n; i++) { G[i][0] = 'X'; for(int j = 1; j <= n; j++) { if(G[i][j] == '.') { idX[i][j] = uN; } else if(G[i][j]=='X' && G[i][j-1]!='X') { uN++; } } if(G[i][n] != 'X') uN++; } for(int i = 1; i <= n; i++) { G[0][i] = 'X'; for(int j = 1; j <= n; j++) { if(G[j][i] == '.') { idY[j][i] = uV; } else if(G[j][i]=='X' && G[j-1][i]!='X') { uV++; } } if(G[n][i] != 'X') uV++; } for(int i = 0; i < uN; i++) map[i].clear(); for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(G[i][j] == '.') { map[idX[i][j]].push_back(idY[i][j]); } } } int ans = hungary(); cout << ans << endl; } return 0; }