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个客户,每个客户给出选则猪圈的钥匙和需要购买猪的个数,其中每次客户购买时客户选则的猪圈数量可以相互更换,问最大购买数量. 思路:以客户作为除源点汇点之外的点,然后对于每个猪圈从源点连 ...
随机推荐
- 模拟制作网易云音乐(AudioContext)
记得好早前在慕课网上看到一款可视化音乐播放器,当前是觉得很是神奇,还能这么玩.由于当时刚刚转行不久,好多东西看得稀里糊涂不明白,于是趁着现在有时间又重新梳理了一遍,然后参照官网的API模拟做了一款网易 ...
- FTP配置的一些笔记
1.必须关闭防火墙 iptables -F iptables -X iptables -Z vi /etc/selinux/config SELINUX=disabled seten ...
- react-native多图选择、图片裁剪(支持ad/ios图片个数控制)
扯淡: 目前关于rn比较知名并且封装好的图片选择控件很多,不过能同时支持多图片上传,个数控制兼容iOS/Ad的却寥寥无几,而今天介绍的这款框架可以实现:图片裁剪.最大图片个数限制.拍照.本地相册等功能 ...
- selenium+testN自动化测试框架搭建
自动化测试框架搭建 1 Java环境的搭建 1.1访问oracle的官网下载最新版本的jdk http://www.oracle.com/technetwork/java/javase/downloa ...
- Docker简介和安装
1.Docker 和传统虚拟化方式的不同之处 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程: 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核 ...
- Asp.Net 为什么需要异步
之前看过别人提出为什么在本是多线程的Asp.Net下需要异步环境的时候,提出在Asp.Net环境下本身就是多线程,每个请求就是由一个专门IIS线程负责(咱不说Core下无IIS的情况).所以以此推论A ...
- 《项目架构那点儿事》——快速构建Junit用例
[前 言]按照惯例,在实际项目中我往往会对自己编写的程序进行测试,当测试通过后才能将其用于实战中,当然,编写单元测试是不可避免的,可以直接清晰的检验出 我们程序的可靠性.可只执行性,从中发现问题从而得 ...
- Liunx文件解压与压缩
文件压缩和解压缩 常见压缩格式如下 .zip .gz .bz2 .tar.gz .tar.gz2 .zip压缩 zip 压缩文件名 源文件 压缩文件 zip -r(递归) 压缩文件名 源目录 压缩目录 ...
- 一个RtspServer的设计与实现和RTSP2.0简介
一个RtspServer的设计与实现和RTSP2.0简介 前段时间着手实现了一个RTSP Server,能够正常实现多路RTSP流的直播播放,因项目需要,只做了对H.264和AAC编码的支持,但是 ...
- c# winform 窗体之间的传参
说起winform程序中窗体之间的参数互传,大家找度娘会找到很多方法: 1.在窗体类中创建全局变量,类型为公开.静态的: 2.在窗体类中定义狗仔函数: 3.通过实践来船体参数: 这三种思路完全来自于霖 ...