网络流 poj 2195
最小费用最大流的模板题
超级源点 m H 超级汇点
容量 1 1 1
费用 0 距离 0
#include<stdio.h> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<vector> #include<queue>using namespace std;#define MAXN 510 #define inf 1000000000 char z[MAXN][MAXN];int S,T,cnt; int head[MAXN]; int x2[MAXN],y2[MAXN],x3[MAXN],y3[MAXN]; queue<int>q1; struct edg {int fr,to,w,next,co; }edge[200000]; void add(int u,int v,int w ,int cos) {edge[cnt].fr=u;edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];edge[cnt].co=cos;head[u]=cnt++; } bool vis[MAXN]; int pre[MAXN],dis[MAXN];bool spfa() {memset(vis,0,sizeof(vis));memset(pre,-1,sizeof(pre));for(int i=0;i<=T;i++)dis[i]=inf;dis[S]=0;q1.push(S);vis[S]=1;while(!q1.empty()){int now = q1.front();q1.pop();vis[now]=0;for(int i=head[now];i!=-1;i=edge[i].next){if(edge[i].w>0){int v=edge[i].to;if(dis[v]>dis[now]+edge[i].co){dis[v]=dis[now]+edge[i].co;pre[v]=i;if(!vis[v]){vis[v]=1;q1.push(v);}}}}}return dis[T]!=inf; } int MCMF() {int ans=0;int flow_sum=0;while(spfa()){int flow = inf;for(int i=pre[T];i!=-1;i=pre[edge[i].fr])if(edge[i].w<flow)flow = edge[i].w;for(int i=pre[T];i!=-1;i=pre[edge[i].fr]){edge[i].w-=flow;edge[i^1].w+=flow;}ans += dis[T];flow_sum += flow;}return ans; } int main() {int n,m;while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0)break;int c1,c2;c1=c2=0;for(int i=1;i<=n;i++){scanf("%s",z[i]);for(int j=0;j<m;j++){if(z[i][j]=='m'){x2[c1]=i;y2[c1++]=j;}else if(z[i][j]=='H'){x3[c2]=i;y3[c2++]=j;}}}cnt=0;S=0;T=c1+c2+1;memset(head,-1,sizeof(head));for(int i=1;i<=c1;i++){add(S,i,1,0); // 点 点 流量 费用add(i,S,0,0);}for(int i=0;i<c1;i++){for(int j=0;j<c2;j++){int a=i+1;int b=j+1+c1;add(a,b,1,abs(x2[i]-x3[j])+abs(y2[i]-y3[j]));add(b,a,0,-(abs(x2[i]-x3[j])+abs(y2[i]-y3[j])));}}for(int i=c1+1;i<=c1+c2;i++){add(i,T,1,0);add(T,i,0,0);}int ans=0;ans = MCMF();printf("%d\n",ans);}return 0; }
View Code
转载于:https://www.cnblogs.com/cherryMJY/p/6555867.html
网络流 poj 2195相关推荐
- POJ 2195 Going Home / HDU 1533(最小费用最大流模板)
题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...
- KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home
最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大.解决这个问题可以用KM算法.理解KM算法需要首先理解"可行顶标"的概念.可行顶标是指关于二分图 ...
- POJ 2195 【二分图最佳匹配】.cpp
题意: 有 n 个房子和 n 个人 每个人走一个单元你就要付 1$ 有什么办法可以让把所有人都分派到房子里 而花费最少 输入: 给出n m 表示该矩阵由n 行 m 列组成 然后给出一个n*m的图 . ...
- 初涉网络流 POJ 1459 Power Network
怒搞一下午网络流,又去我一块心病. 从2F到SAP再到Dinic最终过掉了. 但是书上说Dinic的时间复杂度为v*v*e.感觉也应该超时的啊,但是过掉了,好诡异. 后两种算法都是在第一种的基础上进行 ...
- Poj 2195 Going Home
题目链接:ヾ(≧∇≦*)ゝ 题意:有n*m的矩阵,H表示这个点是一个房子,m表示这个点是一个人,现在每一个人需要走入一个房间,已经知道的是 认得数目和房子的个数一定是相同的,现在问这些人都回到一个房间 ...
- POJ 2195 Going Home 二分图的最大权匹配
POJ2195 Going Home 最小费用最大流 Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2 ...
- POJ - 2195 Going Home(二分图最小权匹配+KM+思维建边/最小费用最大流)
题目链接:点击查看 题目大意:给出一个n*m的地图,现在有一定数量的小人要回到屋子里去,题目保证图中的小人和屋子的数量是一致的,小人回到小屋的距离是两个点坐标的曼哈顿距离,每个小屋只能容纳一个小人,现 ...
- POJ 2195 Going Home 最小费用最大流
这题目同时也可以用KM()算法做,最求小权值匹配而已,权值设置为负数就行,具体KM算法参照:http://blog.csdn.net/cnh294141800/article/details/1895 ...
- 【POJ - 2195】Going Home(二分图最优匹配,费用流 或 KM)
题干: On a grid map there are n little men and n houses. In each unit time, every little man can move ...
最新文章
- 回归模型-线性回归算法
- 新技术不断涌现,下一代云计算的突破口在哪里?
- TPF111视频信号放大器研究
- 微软日本每周只上四天班,销售额提升39.9%!网友:老板快来看啊
- windows10环境下的RabbitMQ安装步骤(图文)
- java高级之Io流
- TensorFlow框架的这些操作你肯定不知道!
- autoscan、aclocal、automake和autoconf区别
- struts与spring整合方法copy
- Instagram CEO:苹果iPad用户数少 不值得开发App
- java 如何判断余数_用java判断一个数是不是回文数!
- 微型计算机原理及应用是啥,微型计算机原理及应用(第2版)
- LoadRunner录制app脚本详解
- 国际知名品牌广告语欣赏(英汉)
- 物联网卡和流量卡相比哪个信号强
- 微信分享功能不可用+不能产生回调
- java考试真题6_JAVA认证考试历年真题:SCJP认证试题解析6
- v-for和v-show一起使用
- [ant design vue] 表单验证成功,提示信息不显示
- 【Unity3D】Animator动画播放时卡死在第一帧BUG系列
热门文章
- 一些VC的快捷键以及调试技巧
- Linux C语言解析 yaml,c – 用yaml cpp解析yaml
- oracle linux 图形化,Linux下Oracle 12C R2图形化安装过程
- braintree php 开发,PHP关于Braintree支付
- 使用proxy转发post请求_3分钟短文 | Linux 使用curl发起post请求的4个常用方式
- 使用 JS 实现一个简单的日历
- svn: E155007 和 E155004
- 阿里云天池 Docker练习场(入门赛) 操作步骤
- 【CCCC】L2-029 特立独行的幸福 (25分),模拟题,set用法
- 【CCCC】L2-023 图着色问题 (25分),,图的染色判定,遍历