标签: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