poj 2195

来源:互联网 发布:腾讯游戏平台 mac版 编辑:程序博客网 时间:2024/05/16 23:59
#include<algorithm>#include<stdio.h>#include<vector>#include<queue>#include<string.h>using namespace std;const int INF = 1000;char a[101][101];typedef pair<int ,int>P ;struct edge{    int to ,cap,cost,rev;};int V;const int maxn = 1000;vector<edge>g[maxn];int  h[maxn];int dist[maxn];int prevv[maxn],preve[maxn];int fabs(int x){    return x>0?x:-x;}struct node{    int x,y;} nodev[maxn];node nodeg[maxn];void add_edge(int from,int to,int cap,int cost){    g[from].push_back((edge)    {        to,cap,cost,g[to].size()    });    g[to].push_back((edge)    {        from,0,-cost,g[from].size()-1    });}int min_cost_flow(int s,int t,int f){    int res = 0;    fill(h,h+1+V,0);    while(f>0)    {        priority_queue<P,vector<P>,greater<P> >que;        fill(dist,dist+V+1,INF);        dist[s] = 0;        que.push(P(0,s));        while(!que.empty())        {            P p = que.top();            que.pop();            int v = p.second;            if(dist[v]<p.first)                continue;            for(int i = 0; i<g[v].size(); i++)            {                edge &e = g[v][i];                if(e.cap>0&&dist[e.to]>dist[v]+e.cost+h[v]-h[e.to])                {                    dist[e.to] = dist[v] +e.cost +h[v] - h[e.to];                    prevv[e.to] = v;                    preve[e.to] = i;                    que.push(P(dist[e.to],e.to));                }            }        }        if(dist[t]==INF)        {            return -1;        }        for(int v= 0; v<=V; v++)        {            h[v]+=dist[v];        }        int d = f;        for(int v = t; v!=s; v=prevv[v])        {            d = min(d,g[prevv[v]][preve[v]].cap);        }        res+=d*h[t];        f-=d;        for(int v = t; v!=s; v=prevv[v])        {            edge &e = g[prevv[v]][preve[v]];            e.cap -=d;            g[v][e.rev].cap+=d;        }    }    return res;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF&&m&&n)    {        for(int i = 0;i<maxn;i++)            g[i].clear();        int cot1 =1;        int cot2=1;        for(int i =1 ; i<=n; i++)        {            scanf("%s",a[i]+1);        }        for(int i = 1; i<=n; i++)        {            for(int j = 1; j<=m; j++)            {                if(a[i][j]=='m')                {                    nodev[cot1].x = i;                    nodev[cot1].y = j;                    cot1++;                }                else                {                    if(a[i][j]=='H')                    {                        nodeg[cot2].x=i;                        nodeg[cot2].y =j;                        cot2++;                    }                }            }        }        cot1--;        cot2--;        V = cot1*2+1;        for(int i = 1; i<=cot1; i++)        {            add_edge(0,i,1,0);        }        for(int i = 1; i<=cot2; i++)        {            add_edge(cot1+i,2*cot1+1,1,0);        }        for(int i  = 1; i<=cot1; i++)            for(int j = 1; j<=cot2; j++)            {                   add_edge(i,j+cot1,1,fabs(nodev[i].x-nodeg[j].x)+fabs(nodev[i].y - nodeg[j].y));            }        printf("%d\n",min_cost_flow(0, V,cot1));    }}

0 0
原创粉丝点击