您的位置:首页 > 编程语言 > Go语言

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: