#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));
}
}
poj 2195
最新推荐文章于 2025-06-01 16:07:59 发布