poj 3057 Evacuation
占位置。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /*Author :usedrose */ 2 /*Created Time :2015/7/27 0:51:12*/ 3 /*File Name :2.cpp*/ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <sstream> 8 #include <cstdlib> 9 #include <cstring> 10 #include <climits> 11 #include <vector> 12 #include <string> 13 #include <ctime> 14 #include <cmath> 15 #include <deque> 16 #include <queue> 17 #include <stack> 18 #include <set> 19 #include <map> 20 #define INF 0x3f3f3f3f 21 #define eps 1e-8 22 #define pi acos(-1.0) 23 #define MAXN 15 24 #define MAXM 10010 25 #define OK cout << "ok" << endl; 26 #define o(a) cout << #a << " = " << a << endl 27 #define o1(a,b) cout << #a << " = " << a << " " << #b << " = " << b << endl 28 using namespace std; 29 typedef long long LL; 30 const int dx[4] = { -1, 0, 0, 1 }, dy[4] = { 0, -1, 1, 0 }; 31 int V; 32 vector<int> G[MAXM]; 33 int match[MAXM]; 34 bool used[MAXM]; 35 int dist[MAXN][MAXN][MAXN][MAXN]; 36 char field[MAXN][MAXN]; 37 int X, Y; 38 vector<int> dX, dY, pX, pY; 39 40 void addedge(int u, int v) 41 { 42 G[u].push_back(v); 43 G[v].push_back(u); 44 } 45 46 bool dfs(int v) 47 { 48 used[v] = true; 49 for (int i = 0; i < G[v].size(); ++i) { 50 int u = G[v][i], w = match[u]; 51 if (w < 0 || !used[w] && dfs(w)) { 52 match[v] = u; 53 match[u] = v; 54 return true; 55 } 56 } 57 return false; 58 } 59 60 void bfs(int x, int y, int d[MAXN][MAXN]) 61 { 62 queue<int> qx, qy; 63 d[x][y] = 0; 64 qx.push(x); 65 qy.push(y); 66 while (!qx.empty()) { 67 x = qx.front(); qx.pop(); 68 y = qy.front(); qy.pop(); 69 for (int k = 0; k < 4; ++k) { 70 int x2 = x + dx[k], y2 = y + dy[k]; 71 if (0 <= x2 && x2 < X && 0 <= y2 && y2 < Y && field[x2][y2] == '.' && d[x2][y2] < 0) { 72 d[x2][y2] = d[x][y] + 1; 73 qx.push(x2); 74 qy.push(y2); 75 } 76 } 77 } 78 } 79 80 81 void solve() 82 { 83 int n = X*Y; 84 dX.clear(); dY.clear(); 85 pX.clear(); pY.clear(); 86 memset(dist, -1, sizeof(dist)); 87 88 for (int x = 0; x < X; ++x) { 89 for (int y = 0; y < Y; ++y) { 90 if (field[x][y] == 'D') { 91 dX.push_back(x); 92 dY.push_back(y); 93 bfs(x, y, dist[x][y]); 94 } 95 else if (field[x][y] == '.') { 96 pX.push_back(x); 97 pY.push_back(y); 98 } 99 100 } 101 } 102 103 int d = dX.size(), p = pX.size(); 104 for (int i = 0; i < n*d; ++i) 105 G[i].clear(); 106 for (int i = 0; i < d; ++i) { 107 for (int j = 0; j < p; ++j) { 108 if (dist[dX[i]][dY[i]][pX[j]][pY[j]] >= 0) { 109 for (int k = dist[dX[i]][dY[i]][pX[j]][pY[j]]; k <= n; ++k) { 110 addedge((k - 1)*d + i, n*d + j); 111 } 112 } 113 } 114 } 115 116 if (p == 0) { 117 cout << 0 << endl; 118 return; 119 } 120 int num = 0; 121 memset(match, -1, sizeof(match)); 122 for (int v = 0; v < n*d; ++v) { 123 memset(used, 0, sizeof(used)); 124 if (dfs(v)) { 125 if (++num == p) { 126 cout << v / d + 1 << endl; 127 return; 128 } 129 } 130 } 131 cout << "impossible" << endl; 132 } 133 134 135 int main() 136 { 137 //freopen("data.in","r",stdin); 138 //freopen("data.out","w",stdout); 139 cin.tie(0); 140 ios::sync_with_stdio(false); 141 int T; 142 cin >> T; 143 while (T--) { 144 cin >> X >> Y; 145 for (int i = 0; i < X; ++i) 146 cin >> field[i]; 147 solve(); 148 } 149 return 0; 150 }