POJ 2195Going Home(网络流之最小费用流)
题目地址: id=2195">POJ2195
本人职业生涯费用流第一发!!快邀请赛了。决定还是多学点东西。起码碰到简单的网络流要A掉。以后最大流费用流最小割就一块刷。
曾经费用流在我心目中一直是高大上。高不可攀的形象,可这两天才发现,原来费用流就是一个spfa再加点东西。
。
。
一直以为费用流会比最大流的isap要麻烦好多,毕竟多了一个费用的元素。
。。
。我真的错了。。细致研究了一下。仅仅用一个spfa确实就能够攻克了。。
。
这题是一个入门题(尽管还多了些处理。
。
)。建图思路非常easy,就是将人与源点相连。流量为1,费用为0。将房子与汇点相连。流量1,费用0.刚開始不知道这流量的1有何用,后来想了想,认为应该是限制流量的,由于每一个人和房子都仅仅能走一次。然后将人与房子相连,流量1,费用为须要走的步数。最后求最小费用流就可以。
代码例如以下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <algorithm> using namespace std;
const int INF=0x3f3f3f3f;
int head[300], s, t, cnt, cost, flow;
int d[300], q[10000], cur[300], vis[300];
struct node
{
int u, v, cap, cost, next;
} edge[100000];
struct a
{
int x, y;
} men[300];
struct b
{
int x, y;
} house[300];
void add(int u, int v, int cap, int cost)
{
edge[cnt].v=v;
edge[cnt].cap=cap;
edge[cnt].cost=cost;
edge[cnt].next=head[u];
head[u]=cnt++; edge[cnt].v=u;
edge[cnt].cap=0;
edge[cnt].cost=-cost;
edge[cnt].next=head[v];
head[v]=cnt++;
}
int spfa()
{
int f1=0, f2=0, i, minflow=INF;
memset(d,INF,sizeof(d));
memset(vis,0,sizeof(vis));
d[s]=0;
cur[s]=-1;
q[f1++]=s;
while(f1>=f2)
{
int u=q[f2++];
vis[u]=0;
for(i=head[u]; i!=-1; i=edge[i].next)
{
int v=edge[i].v;
if(d[v]>d[u]+edge[i].cost&&edge[i].cap)
{
d[v]=d[u]+edge[i].cost;
if(minflow>edge[i].cap)
minflow=edge[i].cap;
cur[v]=i;
if(!vis[v])
{
q[f1++]=v;
vis[v]=1;
}
}
}
}
if(d[t]==INF) return 0;
flow+=minflow;
cost+=minflow*d[t];
for(i=cur[t]; i!=-1; i=cur[edge[i^1].v])
{
edge[i].cap-=minflow;
edge[i^1].cap+=minflow;
}
return 1;
}
int main()
{
int n, m, i, n1, n2, j;
char mp[200][200];
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
n1=0;
n2=0;
memset(head,-1,sizeof(head));
cnt=0;
for(i=0; i<n; i++)
{
scanf("%s",mp[i]);
for(j=0; j<m; j++)
{
if(mp[i][j]=='m')
{
men[++n1].x=i;
men[n1].y=j;
}
else if(mp[i][j]=='H')
{
house[++n2].x=i;
house[n2].y=j;
}
}
}
s=0;
t=n1+n2+1;
flow=0;
cost=0;
for(i=1; i<=n1; i++)
add(s,i,1,0);
for(i=1; i<=n2; i++)
add(i+n1,t,1,0);
for(i=1; i<=n1; i++)
{
for(j=1; j<=n2; j++)
{
add(i,j+n1,1,abs(men[i].x-house[j].x)+abs(men[i].y-house[j].y));
}
}
while(spfa());
printf("%d\n",cost);
}
return 0;
}
POJ 2195Going Home(网络流之最小费用流)的更多相关文章
- POJ 2516 Minimum Cost (网络流,最小费用流)
POJ 2516 Minimum Cost (网络流,最小费用流) Description Dearboy, a goods victualer, now comes to a big problem ...
- Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流)
Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流) Description 10年一度的银河系赛车大赛又要开始了.作为全 ...
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
题目大意:是有M个猪圈,N个顾客,顾客要买猪,神奇的是顾客有一些猪圈的钥匙而主人MIRKO却没有钥匙,多么神奇?顾客可以在打开的猪圈购买任意数量的猪,只要猪圈里有足够数量的猪.而且当顾客打开猪圈后mi ...
- HDU 1853Cyclic Tour(网络流之最小费用流)
题目地址:pid=1853">HDU1853 费用流果然好奇妙. .还能够用来推断环...假设每一个点都是环的一部分并且每一个点仅仅能用到一次的话,那每一个点的初度入度都是1,这就能够 ...
- poj 3281 Dining 网络流-最大流-建图的题
题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...
- POJ 3422 矩阵取数 最小费用流拆点+负边
Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9153 Accepted: ...
- poj 2195 Going Home(最小费用流)
题目链接:http://poj.org/problem?id=2195 题目大意是给一张网格,网格中m代表人,h代表房子,网格中的房子和人数量相等,人可以向上向下走,每走1步花费加1,每个房子只能住一 ...
- poj 2195Going Home
http://poj.org/problem?id=2195 #include<cstdio> #include<cstring> #include<cmath> ...
- poj 1149经典网络流构图
题意:m个猪圈,n个客户,每个客户给出选则猪圈的钥匙和需要购买猪的个数,其中每次客户购买时客户选则的猪圈数量可以相互更换,问最大购买数量. 思路:以客户作为除源点汇点之外的点,然后对于每个猪圈从源点连 ...
随机推荐
- 引入CSS的方式有哪些?link和@import的有何区别应如何选择【转载】
看到淘宝网页中这样写使用的是import,而很多网站都是使用link,当然还有一些页面比较简单,流量很大的网站,是直接将CSS写在html代码中的?他们有什么区别?CSS用import还是link好? ...
- 机器学习数学|偏度与峰度及其python实现
机器学习中的数学 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原创文章,如需转载请保留出处 本博客为七月在线邹博老师机器学习数学课程学习笔记 矩 对于随机变量X,X的K阶原点矩为 \[E( ...
- ASP.NET没有魔法——ASP.NET MVC Controller的实例化与执行
上一章节中对路由的注册和匹配过程进行了介绍,知道了MVC的Http请求最终是交由MvcHandler处理的,而其处理过程就是对Controller的创建.执行和释放. 本章将从以下几点进一步对上面提到 ...
- bootstrap栅格布局学习历程
了解一个东西.他叫什么?他由什么组成,能做什么? 现在响应式的网站(在不同分辨率下有不同的布局)很瘦欢迎.优点:1.解决设备之间的差异化展示缺点:a.兼容性代码多,工作量大,加载速度受到影响;b.用户 ...
- 项目实战4—haproxy 负载均衡和ACL控制
haproxy实现高级负载均衡实战 环境:随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务提供,不在和pc站点一起提供服务 ...
- 维多利亚的秘密 golang入坑系统
原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...
- Office2016 KMS激活
Office标准版激活 一新买本子需要安装Office,闲来无事就安装了一款Office Standard 2016,网上许多激活秘钥均已过期,无法激活,无奈下选择KMS激活. KMS下载链接如下: ...
- 《java.util.concurrent 包源码阅读》06 ArrayBlockingQueue
对于BlockingQueue的具体实现,主要关注的有两点:线程安全的实现和阻塞操作的实现.所以分析ArrayBlockingQueue也是基于这两点. 对于线程安全来说,所有的添加元素的方法和拿走元 ...
- HTML5到底将给企业带来什么?
HTML5 是近年来互联网行业的热门词汇,火的很.有人高调宣称"APP 将在几年内灭亡,HTML5 取而代之" 改变企业网络广告的模式与分布 广告是企业网络营销的主要方式之一 十几 ...
- async await Task
一.使用Task 引用命名空间 using System.Threading.Tasks; 1.工厂方式 Task.Factory.StartNew(() => {Console.WriteLi ...