Oil Skimming HDU - 4185(匹配板題)
阿新 • • 發佈:2018-07-14
win back memory ogr printf source efi maximum ger
Input
The input starts with an integer K (1 <= K <= 100) indicating the number of cases. Each case starts with an integer N (1 <= N <= 600) indicating the size of the square grid. Each of the following N lines contains N characters that represent the cells of a row in the grid. A character of ‘#‘ represents an oily cell, and a character of ‘.‘ represents a pure water cell.
Output
For each case, one line should be produced, formatted exactly as follows: "Case X: M" where X is the case number (starting from 1) and M is the maximum number of scoops of oil that may be extracted.
Source
The 2011 South Pacific Programming Contest
Oil Skimming
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3426 Accepted Submission(s): 1432
Sample Input 1 6 ...... .##... .##... ....#. ....## ......
Sample Output Case 1: 3
Recommend lcy
就是一個板題。。。
相鄰的兩個#建邊。。。。然後求最大匹配就好了
用匈牙利就夠了 我用的hc
#include <iostream> #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <algorithm> #include <vector> #define mem(a, b) memset(a, b, sizeof(a)) using namespace std; const int maxn = 10010, INF = 0x7fffffff; int dx[maxn], dy[maxn], cx[maxn], cy[maxn], used[maxn]; int nx, ny, dis, n; char str[610][610]; int gra[610][610]; vector<int> G[40005]; int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; int bfs() { queue<int> Q; dis = INF; mem(dx, -1); mem(dy, -1); for(int i=1; i<=nx; i++) { if(cx[i] == -1) { Q.push(i); dx[i] = 0; } } while(!Q.empty()) { int u = Q.front(); Q.pop(); if(dx[u] > dis) break; for(int v=0; v<G[u].size(); v++) { int i=G[u][v]; if(dy[i] == -1) { dy[i] = dx[u] + 1; if(cy[i] == -1) dis = dy[i]; else { dx[cy[i]] = dy[i] + 1; Q.push(cy[i]); } } } } return dis != INF; } int dfs(int u) { for(int v=0; v<G[u].size(); v++) { int i = G[u][v]; if(!used[i] && dy[i] == dx[u] + 1) { used[i] = 1; if(cy[i] != -1 && dis == dy[i]) continue; if(cy[i] == -1 || dfs(cy[i])) { cy[i] = u; cx[u] = i; return 1; } } } return 0; } int hk() { int res = 0; mem(cx, -1); mem(cy, -1); while(bfs()) { mem(used, 0); for(int i=1; i<=nx; i++) if(cx[i] == -1 && dfs(i)) res++; } return res; } int main() { int T, kase = 0; cin>> T; while(T--) { mem(gra, 0); int ans = 0; for(int i=0; i<maxn; i++) G[i].clear(); cin>> n; for(int i=0; i<n; i++) { cin>> str[i]; for(int j=0; j<n; j++) { if(str[i][j] == ‘#‘) gra[i][j] = ++ans; } } for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(str[i][j] == ‘#‘) for(int k=0; k<4; k++) { int nx = i + dir[k][0]; int ny = j + dir[k][1]; if(str[nx][ny] == ‘#‘ && nx >= 0 && ny >= 0 && nx < n && ny < n) G[gra[i][j]].push_back(gra[nx][ny]), G[gra[nx][ny]].push_back(gra[i][j]); } } } nx = ny = ans; printf("Case %d: %d\n",++kase, hk()/2); } return 0; }
Oil Skimming HDU - 4185(匹配板題)