hdu 1533 Going Home (zkw + spfa和slf优化)
2016-04-07 14:46
561 查看
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <algorithm> #include <deque> using namespace std; #define N 1002 #define M 500020 #define inf 0x3f3f3f3f #define eps 1e-8 #define inf 0x3f3f3f3f int n; int m; char str ; int x , y , xx , yy ; int nx, ny; struct zkw { int C, D; int s, t; int fst , nxt[M], vv[M], cap[M], flow[M], cost[M], e; bool vis ; int F; void init() { memset(fst, -1, sizeof fst); e = 0; C = D = 0; } void add(int u, int v, int f, int c) { vv[e] = v, nxt[e] = fst[u], cost[e] = c, cap[e] = f, flow[e] = 0, fst[u] = e++; vv[e] = u, nxt[e] = fst[v], cost[e] = -c, cap[e] = flow[e] = 0, fst[v] = e++; } int aug(int u, int f) { if(u == t) { C += D * f; F += f; return f; } vis[u] = 1; int tmp = f; for(int i = fst[u]; ~i; i = nxt[i]) { int v = vv[i]; if(cap[i] > flow[i] && cost[i] == 0 && !vis[v]) { int d = aug(v, tmp < cap[i] - flow[i]? tmp: cap[i] - flow[i]); flow[i] += d; flow[i^1] -= d; tmp -= d; if(!tmp) return f; } } return f - tmp; } bool modLabel() { static int d ; memset(d, 0x3f, sizeof d); d[t] = 0; deque<int> q; q.push_back(t); while(!q.empty()) { int dt, u = q.front(); q.pop_front(); for(int i = fst[u]; ~i; i = nxt[i]) { int v = vv[i]; if(cap[i^1] > flow[i^1] && (dt = d[u] - cost[i]) < d[v]) { d[v] = dt; int tmp = inf; if(q.size() > 0) tmp = d[q.front()]; if(dt <= tmp) q.push_front(v); else q.push_back(v); } } } for(int i = 0; i <= t; ++i) { for(int j = fst[i]; ~j; j = nxt[j]) { int v = vv[j]; cost[j] += d[v] - d[i]; } } D += d[s]; return d[s] < inf; } int gao(int s, int t) { this -> s = s, this -> t = t; F = 0; while(modLabel()) { do memset(vis, 0, sizeof vis); while(aug(s, inf)); } return C; } }go; int main() { while(scanf("%d%d", &n, &m) != EOF && n) { nx = ny = 0; for(int i = 1; i <= n; ++i) { scanf("%s", str[i] + 1); for(int j = 1; j <= m; ++j) { if(str[i][j] == 'm') { nx++; x[nx] = i; y[nx] = j; } if(str[i][j] == 'H') { ny++; xx[ny] = i; yy[ny] = j; } } } int s = 0, t = nx + ny + 1; go.init(); for(int i = 1; i <= nx; ++i) { for(int j = 1; j <= ny; ++j) { int d = abs(x[i] - xx[j]); d += abs(y[i] - yy[j]); go.add(i, j + nx, 1, d); } } for(int i = 1; i <= nx; ++i) go.add(s, i, 1, 0); for(int i = 1; i <= ny; ++i) go.add(i + nx, t, 1, 0); printf("%d\n", go.gao(s, t)); if(go.F != nx) { vector<int> tmp; tmp[0] = 1; } } return 0; }
相关文章推荐
- 全局偏移表(GOT)和过程链接表(PLT)
- django入门记录 2
- golang利用组合实现继承
- GoogleTest Primer
- go语言的中“继承”
- Golang之继承模拟
- ubuntu14.04如何使用google search
- light OJ1259 - Goldbach`s Conjecture
- django manage.py Unknown command: 'runfcgi'
- hdu 1533 Going Home(zkw费用流)
- (Algorithm)不相交集(Disjoint-set)
- What are some good libraries for dynamic Bayesian networks
- go项目-解决端口占用问题
- Django1.6 用Form实现注册登录注销修改密码
- Django1.6 用Form实现注册登录注销修改密码
- Django REST framework 的快速入门教程
- Go by Example
- 快速排序算法 原理及golang语言实现
- 设计模式-装饰者模式(Go语言描述)
- algorithm@ Strongly Connected Component