poj 2195

来源:互联网 发布:淘宝一次性粥杯 编辑:程序博客网 时间:2024/05/29 16:23
#include <iostream>#include <cstring>#include <cstdio>#include <queue>#include <algorithm>#include <vector>#define MAXN 210#define MAXE 30010#define FOR(i_,a,b) for( int i_ = a; i_ <= b; i_ ++ )#define INF 0x7ffffffusing namespace std;struct Node{    int x;    int y;} M[MAXN], H[MAXN];struct EDGE{    int u, v,next;    int flow, cost, cap ;}e[MAXE];int head[MAXN];int dis_road( int a, int b ){    return abs(M[a].x-H[b].x)+abs(M[a].y-H[b].y);}void add_edge( int u, int v, int cap, int cost, int &num ){    e[num].u = u;    e[num].v = v;    e[num].cap = cap;    e[num].flow = 0;    e[num].cost = cost;    e[num].next = head[u];    head[u] = num ++;    e[num].u = v;    e[num].v = u;    e[num].flow = 0;    e[num].cap = 0;    e[num].cost = -cost;    e[num].next = head[v];    head[v] = num ++;}int get_map( int m, int n ){    char map[110];    int num = 0, mn = 0, hn = 0;    FOR(i,0,m-1) {        scanf("%s",map);        FOR(j,0,n-1){            if( map[j] =='H' ) H[++hn].x = i, H[hn].y = j;            if( map[j] == 'm' )M[++mn].x = i, M[mn].y = j;        }    }    FOR(i,0,MAXN )head[i] = -1;    int s = 0, t = hn*2+1;    FOR(i,1,mn) {        add_edge( s,i, 1, 0, num );        add_edge( mn+i, t, 1, 0, num );        FOR(j,1,hn) add_edge( i, j+mn, 1, dis_road(i,j), num );    }    return t;}int d[MAXN],path[MAXN], c[MAXN], que[MAXN];bool iq[MAXN];bool spfa( int s, int t, int n ){    int front = 0, rear = 0;    FOR(i,0,n ) d[i] = INF, iq[i] = false;    d[s]= 0;    c[s] = INF;    path[s] = s;    iq[s] = true;    que[rear++] = s;    while(rear!=front)    {        int u = que[front++];        if( front == MAXN ) front = 0;        iq[u] = false;        for( int p = head[u]; p!=-1; p = e[p].next )            if( e[p].cap > e[p].flow && d[ e[p].v ] > d[ u ] + e[p].cost )            {                d[ e[p].v ] = d[u] + e[p].cost;                c[ e[p].v ] = min( c[u], e[p].cap - e[p].flow );                path[ e[p].v ] = p;                if( !iq[ e[p].v ] )                {                    iq[ e[p].v] = true;                    que[rear++] = e[p].v;                    if( rear == MAXN ) rear = 0;                }            }    }    if( d[t] == INF ) return false;    else return true;}int mincost( int s, int t, int n ){    int flow = 0, cost = 0;    while( spfa( s, t, n ) )    {        flow += c[t];        cost += c[t]*d[t];        for( int u = t; u!=s; u = e[ path[u] ].u )        {            e[ path[u] ].flow += c[t];            e[ path[u]^1 ].flow -= c[t];        }    }    return cost;}int main(){    //freopen("in.txt","r", stdin );    int m, n;    while( ~scanf("%d%d",&m,&n), m+n )    {        int t = get_map( m, n );        printf("%d\n",mincost(0,t, t+1));    }    return 0;}

原创粉丝点击