poj 3057 Evacuation

占位置。。

  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 }
View Code
原文地址:https://www.cnblogs.com/usedrosee/p/4679419.html