标签:des style blog http color os io strong for
解题报告
思路:
bfs建图跑一下费用流就行。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
struct E {
int v,cost,cap,next;
} edge[100000];
int head[1000],cnt,dis[1000],pre[1000],vis[1000],s,t,mmap[110][110],h,w,f[1100],cost,flow;
struct N {
int x,y,step;
};
void add(int u,int v,int cost,int cap) {
edge[cnt].v=v;
edge[cnt].cost=cost;
edge[cnt].cap=cap;
edge[cnt].next=head[u];
head[u]=cnt++;
edge[cnt].v=u;
edge[cnt].cost=-cost;
edge[cnt].cap=0;
edge[cnt].next=head[v];
head[v]=cnt++;
}
int dx[]= {-1,0,1,0};
int dy[]= {0,1,0,-1};
void bfs(int x,int y) {
queue<N>q;
int v[110][110];
memset(v,0,sizeof(v));
N next,now;
now.x=x;
now.y=y;
now.step=0;
v[x][y]=1;
q.push(now);
while(!q.empty()) {
now=q.front();
q.pop();
if(mmap[now.x][now.y]>=101) {
add(mmap[x][y],mmap[now.x][now.y],now.step,1);
}
for(int i=0; i<4; i++) {
next.x=now.x+dx[i];
next.y=now.y+dy[i];
if(next.x>=0&&next.x<h&&next.y>=0&&next.y<w&&!v[next.x][next.y]) {
next.step=now.step+1;
v[next.x][next.y]=1;
q.push(next);
}
}
}
}
int _spfa() {
for(int i=0; i<=201; i++) {
dis[i]=inf;
vis[i]=pre[i]=f[i]=0;
}
dis[s]=0;
vis[s]=1;
pre[s]=-1;
f[s]=inf;
queue<int>Q;
Q.push(s);
while(!Q.empty()) {
int u=Q.front();
Q.pop();
vis[u]=0;
for(int i=head[u]; i!=-1; i=edge[i].next) {
int v=edge[i].v;
if(edge[i].cap&&dis[v]>dis[u]+edge[i].cost) {
pre[v]=i;
dis[v]=dis[u]+edge[i].cost;
f[v]=min(f[u],edge[i].cap);
if(!vis[v]) {
vis[v]=1;
Q.push(v);
}
}
}
}
if(dis[t]==inf)return 0;
flow+=f[t];
cost+=f[t]*dis[t];
for(int i=pre[t]; i!=-1; i=pre[edge[i^1].v]) {
edge[i].cap-=f[t];
edge[i^1].cap+=f[t];
}
return 1;
}
void mcmf() {
cost=flow=0;
while(_spfa());
printf("%d\n",cost);
}
int main() {
int i,j,n,m;
char str[1000];
while(~scanf("%d%d",&h,&w)) {
n=101,m=1;
s=0,t=201;
if(!h&&!w)break;
memset(edge,0,sizeof(edge));
memset(head,-1,sizeof(head));
cnt=0;
for(i=0; i<h; i++) {
scanf("%s",str);
for(j=0; j<w; j++) {
if(str[j]=='.')
mmap[i][j]=-1;
else if(str[j]=='H')
mmap[i][j]=n++;
else if(str[j]=='m')
mmap[i][j]=m++;
}
}
for(i=0; i<h; i++) {
for(j=0; j<w; j++) {
if(mmap[i][j]>=1&&mmap[i][j]<=100) {
add(0,mmap[i][j],0,1);
bfs(i,j);
}
if(mmap[i][j]>=101)
add(mmap[i][j],t,0,1);
}
}
mcmf();
}
return 0;
}| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 18017 | Accepted: 9185 |
Description

Input
Output
Sample Input
2 2 .m H. 5 5 HH..m ..... ..... ..... mm..H 7 8 ...H.... ...H.... ...H.... mmmHmmmm ...H.... ...H.... ...H.... 0 0
Sample Output
2 10 28
Source
POJ训练计划2195_Going Home(网络流/费用流)
标签:des style blog http color os io strong for
原文地址:http://blog.csdn.net/juncoder/article/details/38780109