栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 2404 Going Home

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 2404 Going Home

#include<stdio.h>#include<string.h>#include<iostream>#include<queue>#include<math.h>#define maxn 305#define inf 0x7fffffffusing namespace std;struct Edge{ int v,cap,cost,next;}edge[110*110*2];int head[maxn],en,s,t;void addedge(int u,int v,int cap,int cost){ edge[en].v=v,edge[en].cap=cap,edge[en].cost=cost; edge[en].next=head[u]; head[u]=en++; swap(u,v); edge[en].v=v,edge[en].cap=0,edge[en].cost= - cost; edge[en].next=head[u]; head[u]=en++;}void mcmf(){ int c=0,f=0; queue<int> q; int dis[maxn],pre[maxn]; while(1) { bool vis[maxn]={0}; int top=0; for(int i=0;i<=t;i++) dis[i]=(i==s? 0:inf); q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int e=head[u];e!=-1;e=edge[e].next) { int v=edge[e].v; if(edge[e].cap>0&&dis[v]>dis[u]+edge[e].cost) { dis[v]=dis[u]+edge[e].cost; pre[v]=e; if(!vis[v]) { q.push(v); vis[v]=1; } } } } if(dis[t]==inf) break; int a=inf; int p; for(int u=t;u!=s;u=edge[p^1].v) { p=pre[u]; a=(a<edge[p].cap? a:edge[p].cap); } for(int u=t;u!=s;u=edge[p^1].v) { p=pre[u]; edge[p].cap -= a; edge[p^1].cap += a; } c+=dis[t]*a; } printf("%dn",c);}char g[110][110];struct Pos{ int x,y;}mp[110],hp[110];int main(){ int n,a,b,c; int N,M; int i,j; while(cin>>N>>M) { if(!N&&!M) break; en=0; memset(head,-1,sizeof(head)); for(i=0;i<N;i++) scanf("%s",g[i]); int mm=0,hh=0; for(i=0;i<N;i++) for(j=0;j<M;j++) { if(g[i][j]=='H') { hp[hh].x=i; hp[hh++].y=j; } if(g[i][j]=='m') { mp[mm].x=i; mp[mm++].y=j; } } s=0,t=hh+mm+1; for(i=1;i<=mm;i++) addedge(s,i,1,0); for(i=mm+1;i<=mm+hh;i++) addedge(i,t,1,0); for(i=0;i<hh;i++) for(j=0;j<mm;j++) { int d=fabs(hp[i].x-mp[j].x)+fabs(hp[i].y-mp[j].y); addedge(j+1,i+1+mm,1,d); } mcmf(); } return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373706.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号