Advertisement
Guest User

Untitled

a guest
Oct 4th, 2015
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.44 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <set>
  4. #include <map>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. struct Edge {
  10.     int to, c, f;
  11.  
  12.     Edge(int _to, int _c): to(_to), c(_c), f(0) {}
  13. };
  14.  
  15. const int MAXN = 4, MAXC = 105, MAXM = 1005, MAXCNT = MAXC + 60 * MAXN,
  16.     gox[] = {-1, -1, 0, 1, 1, 0}, goy[] = {0, 1, 1, 0, -1, -1};
  17. int tx[MAXN], ty[MAXN], hp[MAXN], cx[MAXC], cy[MAXC], v[MAXC],
  18.     mx[MAXM], my[MAXM], tok[MAXN], x[MAXCNT], y[MAXCNT],
  19.     tox[MAXC], toy[MAXC], at[MAXC], w, h, n, c, m, cnt;
  20. char used[MAXCNT];
  21. vector<Edge> e;
  22. vector<int> g[MAXCNT];
  23. set< pair<int, int> > bad;
  24. map<pair<int, int>, int> added;
  25.  
  26. bool outside(int x, int y) {
  27.     return x < 0 || x >= w || y < 0 || y >= h;
  28. }
  29.  
  30. void addVertices(int xx, int yy, int &cnt) {
  31.     for(int i = 0; i < 6; i++)
  32.         for(int j = 0; j < 6; j++) {
  33.             int xxx = xx + gox[i] + gox[j], yyy = yy + goy[i] + goy[j];
  34.             if(outside(xxx, yyy) ||
  35.                added.find(make_pair(xxx, yyy)) != added.end())
  36.                 continue;
  37.             x[cnt] = xxx;
  38.             y[cnt] = yyy;
  39.             added[make_pair(xxx, yyy)] = cnt;
  40.             cnt++;
  41.             x[cnt] = xxx;
  42.             y[cnt] = yyy;
  43.             cnt++;
  44.         }
  45. }
  46.  
  47. void addEdge(int v, int u, int cap) {
  48.     g[v].push_back(e.size());
  49.     e.push_back(Edge(u, cap));
  50.     g[u].push_back(e.size());
  51.     e.push_back(Edge(v, 0));
  52. }
  53.  
  54. void addFlow(int id) {
  55.     e[id].f++;
  56.     e[id ^ 1].f--;
  57. }
  58.  
  59. void bfs(int sx, int sy, int v, int id) {
  60.     queue< pair<int, int> > q;
  61.     map< pair<int, int>, int> dist;
  62.     q.push(make_pair(sx, sy));
  63.     dist[make_pair(sx, sy)] = 0;
  64.     while(!q.empty()) {
  65.         int vx = q.front().first, vy = q.front().second;
  66.         q.pop();
  67.         if(added.find(make_pair(vx, vy)) != added.end())
  68.             addEdge(id, added[make_pair(vx, vy)], 1);
  69.         int dv = dist[make_pair(vx, vy)];
  70.         if(dv == v)
  71.             continue;
  72.         for(int i = 0; i < 6; i++) {
  73.             int xx = vx + gox[i], yy = vy + goy[i];
  74.             if(outside(xx, yy) || bad.find(make_pair(xx, yy)) != bad.end() ||
  75.                dist.find(make_pair(xx, yy)) != dist.end())
  76.                 continue;
  77.             dist[make_pair(xx, yy)] = dv + 1;
  78.             q.push(make_pair(xx, yy));
  79.         }
  80.     }
  81. }
  82.  
  83. bool dfs(int v, int t) {
  84.     if(v == t)
  85.         return true;
  86.     used[v] = true;
  87.     for(size_t i = 0; i < g[v].size(); i++) {
  88.         int u = e[g[v][i]].to, cf = e[g[v][i]].c - e[g[v][i]].f;
  89.         if(!used[u] && cf > 0 && dfs(u, t)) {
  90.             addFlow(g[v][i]);
  91.             return true;
  92.         }
  93.     }
  94.     return false;
  95. }
  96.  
  97. int maxFlow(int s, int t, int n) {
  98.     int res = 0;
  99.     while(true) {
  100.         for(int i = 0; i < n; i++)
  101.             used[i] = false;
  102.         if(!dfs(s, t))
  103.             break;
  104.         res++;
  105.     }
  106.     return res;
  107. }
  108.  
  109. bool solve() {
  110.     cnt = c;
  111.     added.clear();
  112.     for(int i = 0; i < n; i++)
  113.         if(tok[i])
  114.             addVertices(tx[i], ty[i], cnt);
  115.     int tcnt = 0;
  116.     for(int i = 0; i < n; i++)
  117.         if(tok[i])
  118.             tcnt++;
  119.     cnt += tcnt;
  120.     int s = cnt++, t = cnt++;
  121.     e.clear();
  122.     for(int i = 0; i < cnt; i++)
  123.         g[i].clear();
  124.     for(int i = 0; i < c; i++)
  125.         addEdge(s, i, 1);
  126.     for(int i = 0; i < c; i++)
  127.         bfs(cx[i], cy[i], v[i], i);
  128.     for(int i = c; i < cnt - 2 - tcnt; i += 2) {
  129.         addEdge(i, i + 1, 1);
  130.         int tid = cnt - 2 - tcnt;
  131.         for(int j = 0; j < n; j++) {
  132.             if(!tok[j])
  133.                 continue;
  134.             bool ok = false;
  135.             for(int d0 = 0; d0 < 6; d0++)
  136.                 for(int d1 = 0; d1 < 6; d1++)
  137.                     if(tx[j] + gox[d0] + gox[d1] == x[i] &&
  138.                        ty[j] + goy[d0] + goy[d1] == y[i]) {
  139.                         ok = true;
  140.                         break;
  141.                     }
  142.             if(ok)
  143.                 addEdge(i + 1, tid, 1);
  144.             tid++;
  145.         }
  146.     }
  147.     int tid = cnt - 2 - tcnt, sum = 0;
  148.     for(int i = 0; i < n; i++)
  149.         if(tok[i]) {
  150.             addEdge(tid, t, hp[i]);
  151.             sum += hp[i];
  152.             tid++;
  153.         }
  154.     return maxFlow(s, t, cnt) == sum;
  155. }
  156.  
  157. int main() {
  158.     ifstream in("input.txt");
  159.     ofstream out("output.txt");
  160.     in >> w >> h >> n;
  161.     for(int i = 0; i < n; i++)
  162.         in >> tx[i] >> ty[i] >> hp[i];
  163.     in >> c;
  164.     for(int i = 0; i < c; i++) {
  165.         in >> cx[i] >> cy[i] >> v[i];
  166.         v[i]--;
  167.     }
  168.     in >> m;
  169.     for(int i = 0; i < m; i++)
  170.         in >> mx[i] >> my[i];
  171.     for(int i = 0; i < n; i++)
  172.         bad.insert(make_pair(tx[i], ty[i]));
  173.     for(int i = 0; i < m; i++)
  174.         bad.insert(make_pair(mx[i], my[i]));
  175.     int msk = 0;
  176.     for(int i = 0; i < (1 << n); i++) {
  177.         for(int j = 0; j < n; j++)
  178.             tok[j] = ((i & (1 << j)) > 0);
  179.         if(solve() && __builtin_popcount(msk) < __builtin_popcount(i))
  180.             msk = i;
  181.     }
  182.     for(int i = 0; i < n; i++)
  183.         tok[i] = ((msk & (1 << i)) > 0);
  184.     solve();
  185.     int tcnt = __builtin_popcount(msk);
  186.     out << tcnt << '\n';
  187.     int s = cnt - 2;
  188.     for(size_t i = 0; i < g[s].size(); i++) {
  189.         int cat = e[g[s][i]].to, f = e[g[s][i]].f;
  190.         if(!f) {
  191.             tox[cat] = cx[cat];
  192.             toy[cat] = cy[cat];
  193.             at[cat] = -1;
  194.             continue;
  195.         }
  196.         for(size_t j = 0; j < g[cat].size(); j++) {
  197.             int u = e[g[cat][j]].to, ff = e[g[cat][j]].f;
  198.             if(u != s && ff) {
  199.                 tox[cat] = x[u];
  200.                 toy[cat] = y[u];
  201.                 u++;
  202.                 for(size_t k = 0; k < g[u].size(); k++) {
  203.                     int town = e[g[u][k]].to, fff = e[g[u][k]].f;
  204.                     if(town != u - 1 && fff) {
  205.                         at[cat] = town - (cnt - 2 - tcnt);
  206.                         break;
  207.                     }
  208.                 }
  209.                 break;
  210.             }
  211.         }
  212.     }
  213.     for(int i = 0; i < c; i++)
  214.         for(int j = 0; j < c; j++)
  215.             if(at[j] == -1)
  216.                 for(int k = 0; k < c; k++)
  217.                     if(k != j && tox[k] == cx[j] && toy[k] == cy[j]) {
  218.                         at[j] = at[k];
  219.                         tox[k] = cx[k];
  220.                         toy[k] = cy[k];
  221.                         at[k] = -1;
  222.                         break;
  223.                     }
  224.     for(int i = 0; i < c; i++)
  225.         out << tox[i] << ' ' << toy[i] << ' ' << at[i] + 1 << '\n';
  226.     return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement