hdu 1533 going home(费用流初探)
来源:互联网 发布:勒布朗詹姆斯最新数据 编辑:程序博客网 时间:2024/06/03 17:57
题目:http://acm.split.hdu.edu.cn/showproblem.php?pid=1533
题意:给出地图,求m到H的最小步数。
费用流建图:加超级源点和汇点,m连ss费用0,连每个H,费用对应步数;H连 tt,费用0;
#include<cstdio>#include<queue>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn=200001;const int inf=0x3f3f3f3f;int n,m,ss,tt;char mp[105][105];struct Edge{ int from,to,cap,flow,cost;//出点,入点,容量,当前流量,费用(也就是权值) Edge(int u,int v,int c,int f,int w):from(u),to(v),cap(c),flow(f),cost(w){}};struct MCMF{ int n,m; vector<Edge> edges;//保存表 vector<int> G[maxn];//保存邻接关系 int inq[maxn];//判断一个点是否在队列当中(SPFA算法当中要用) int d[maxn];//起点到d[i]的最短路径保存值 int p[maxn];//用来记录路径,保存上一条弧 int a[maxn];//找到增广路径后的改进量 void init(int n){ //初始化 this->n=n; for(int i=0;i<=n;i++) G[i].clear(); edges.clear(); } void AddEdge(int from,int to,int cap,int cost){ edges.push_back(Edge(from,to,cap,0,cost));//正向 edges.push_back(Edge(to,from,0,0,-cost));//反向 m=edges.size(); G[from].push_back(m-2);//按照边的编号保存邻接关系 G[to].push_back(m-1); } bool BellmanFord(int s,int t,int& flow,long long& cost){ for(int i=0;i<=n;i++) d[i]=inf; memset(inq,0,sizeof(inq)); d[s]=0; inq[s]=1; p[s]=0; a[s]=inf; queue<int> Q; Q.push(s); while(!Q.empty()){ int u=Q.front(); Q.pop(); inq[u]=0; for(int i=0;i<G[u].size();i++){ Edge& e=edges[G[u][i]]; if(e.cap>e.flow&&d[e.to]>d[u]+e.cost){ d[e.to]=d[u]+e.cost; p[e.to]=G[u][i]; a[e.to]=min(a[u],e.cap-e.flow); if(!inq[e.to]){ Q.push(e.to); inq[e.to]=1; } } } } if(d[t]==inf) return false; flow+=a[t]; cost+=(long long )d[t]*(long long)a[t]; for(int u=t;u!=s;u=edges[p[u]].from){ edges[p[u]].flow+=a[t]; edges[p[u]^1].flow-=a[t]; } return true; } int MincostMaxflow(int s,int t,long long& cost){ int flow = 0; cost=0; while(BellmanFord(s,t,flow,cost)); return cost; }}g;int id(int x,int y){ return (x-1)*m + y;}void build(){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(mp[i][j]=='m'){ g.AddEdge(ss,id(i,j),1,0); for(int ti=1;ti<=n;ti++) for(int tj=1;tj<=m;tj++){ if(mp[ti][tj]=='H'){ g.AddEdge(id(i,j),id(ti,tj),1,fabs(ti-i)+fabs(tj-j)); } } } else if(mp[i][j]=='H') g.AddEdge(id(i,j),tt,1,0); }}int main(){ while(scanf("%d%d",&n,&m)==2&&n+m){ for(int i=1;i<=n;i++) scanf("%s",mp[i]+1); g.init(n*m+2); ss=0,tt=n*m+1; build(); long long ans=0; //for(int i=0;i<g.edges.size();i++) // cout<<g.edges[i].from<<" "<<g.edges[i].to<<" "<<g.edges[i].flow; printf("%d\n",g.MincostMaxflow(ss,tt,ans)); } return 0;}
阅读全文
0 0
- hdu 1533 going home(费用流初探)
- hdu 1533 Going Home 最小费用流
- HDU 1533 Going Home | 费用流
- HDU 1533 Going Home 最小费用流
- Going Home (hdu 1533 最小费用流)
- HDU 1533 Going Home(最小费用流)
- hdu 1533 Going Home(zkw费用流)
- HDU 1533Going Home(费用流)
- hdu 1533 Going Home (最小费用流)
- hdu 1533 going home (最小费用最大流)
- hdu 1533 Going Home【最大流最小费用流】
- 【网络流】【费用流】[HDU 1533]Going Home
- hdu 1533 || poj 2195 Going Home (最小费用最大流)
- POJ 2195 & HDU 1533 Going Home(最小费用最大流)
- hdu 1533 Going Home 最小费用最大流 入门题
- HDU 1533 Going Home(最小费用最大流模版)
- HDU 1533 — Going Home 最小费用最大流
- hdu 1533 Going Home(最小费用最大流)
- python基础实例1:排列数问题
- 面试感悟----一名3年工作经验的程序员应该具备的技能
- c++依赖倒置原则
- Java获取文件的大小
- hibernate uniqueResult方法
- hdu 1533 going home(费用流初探)
- 写给人类的机器学习 2.3 监督学习 III
- [Oracle 11g r2(11.2.0.4.0)]集群守护进程CSS介绍
- html入门篇--绝对定位与相对定位的区别
- MyEclipse 错误提示 Can not find the tag library descriptor for XXX
- 1024程序员节,17城公益骑行,传智播客邀你益骑燃!
- 171015 逆向-内嵌补丁
- 小迪教程第七天——提交方式注入
- HTTP错误代码 404 503 500