POJ 2195 Going Home 最小费用流
裸的最小费用流,当然也可以用KM算法解决,但是比较难写。
注意反向边的距离为正向边的相反数(因此要用SPFA)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=302,src=301,sink=300,INF=1e+8;
int n,m,man,house,x[maxn],y[maxn],cap[maxn][maxn],w[maxn][maxn];
vector<int> next[maxn]; void addedge(int a,int b)
{
next[a].push_back(b);next[b].push_back(a);
cap[a][b]=1;cap[b][a]=0;
} int ab(int xx)
{
if(xx<0)return xx*(-1);
else return xx;
}
int fa[maxn];
int len(int a,int b)
{
if((a==src)||(a==sink)||(b==src)||(b==sink))return 0;
return ab(x[b]-x[a])+ab(y[b]-y[a]);
}
bool inq[maxn];
int times[maxn],dist[maxn];
bool SPFA()
{ memset(inq,0,sizeof(inq));
for(int i=0;i<maxn;i++)
dist[i]=INF;
dist[src]=0;
queue<int>q;
q.push(src);
inq[src]=true;
while(!q.empty())
{
int now=q.front();
q.pop();
inq[now]=false;
for(int i=0;i<next[now].size();i++)
{
int np=next[now][i];
if((dist[np]>dist[now]+w[now][np])&&cap[now][np]>0)
{
dist[np]=dist[now]+w[now][np];
fa[np]=now;
if(!inq[np]){q.push(np);inq[np]=true;}
}
}
}
if( dist[sink]<INF)return true;
else return false;
} int augment() {
int u=sink,delta=INF;
while(u!=src)
{
if(cap[fa[u]][u]<delta)delta=cap[fa[u]][u];
u=fa[u];
}
u=sink;
while(u!=src)
{
cap[fa[u]][u]-=delta;
cap[u][fa[u]]+=delta;
u=fa[u];
}
return dist[sink]*delta;
} int main()
{ios::sync_with_stdio(false);
while(cin>>n>>m)
{
if(n==0&&m==0)return 0;
man=0;house=150;
memset(cap,0,sizeof(cap));memset(w,0,sizeof(w));
for(int i=0;i<maxn;i++)
while(next[i].size()>0)next[i].pop_back();
for(int i=0;i<n;i++)
{ for(int j=0;j<m;j++)
{
char c;
cin>>c;
if(c=='m')
{
x[man]=i;y[man]=j;
man++;
}
if(c=='H')
{
x[house]=i;y[house]=j;
house++;
}
}
}
for(int i=150;i<house;i++)
{
addedge(i,sink);
for(int j=0;j<man;j++)
addedge(j,i);
}
for(int j=0;j<man;j++) addedge(src,j);
int ans=0;
for(int i=0;i<man;i++)
for(int j=150;j<house;j++)
{
w[i][j]=len(i,j);
w[j][i]=w[i][j]*(-1);
}
while(SPFA())
{
ans+=augment();
}
cout<<ans<<endl;
} return 0;
}
,没什么别的了,很简单。
POJ 2195 Going Home 最小费用流的更多相关文章
- POJ 2195 Going Home 最小费用流 裸题
给出一个n*m的图,其中m是人,H是房子,.是空地,满足人的个数等于房子数. 现在让每个人都选择一个房子住,每个人只能住一间,每一间只能住一个人. 每个人可以向4个方向移动,每移动一步需要1$,问所有 ...
- POJ 2195 Going Home 最小费用流 难度:1
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17955 Accepted: 9145 Descr ...
- POJ 2195 Going Home 最小费用最大流 尼玛,心累
D - Going Home Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- poj 2195 二分图带权匹配+最小费用最大流
题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...
- POJ 2195 Going Home / HDU 1533(最小费用最大流模板)
题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...
- POJ 2195 Going Home (带权二分图匹配)
POJ 2195 Going Home (带权二分图匹配) Description On a grid map there are n little men and n houses. In each ...
- poj 2195 Going Home(最小费最大流)
poj 2195 Going Home Description On a grid map there are n little men and n houses. In each unit time ...
- 【POJ 2195】 Going Home(KM算法求最小权匹配)
[POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- poj 2195 Going Home(最小费用流)
题目链接:http://poj.org/problem?id=2195 题目大意是给一张网格,网格中m代表人,h代表房子,网格中的房子和人数量相等,人可以向上向下走,每走1步花费加1,每个房子只能住一 ...
随机推荐
- 并发和多线程(二)--线程安全、synchronized、CAS简介
线程安全性: 当多个线程访问一个类的时候,这个类始终表示出正确的行为,那么这个类是线程安全的. 无状态的对象一定是线程安全的,例如大部分service.dao.Servlet都是无状态的. 线程安全体 ...
- 07C语言程序语句
C语言程序语句 判断语句 if(表达式) {语句} #include <stdio.h> int main(){ printf("请输入2个数字:"); int a,b ...
- HDU多校Round 6
Solved:2 rank:452 I. Werewolf 没有铁人 找铁狼 如果一个环中只有一条狼人边那个人就是铁狼 说铁狼是好人的人也是铁狼 #include <bits/stdc++.h& ...
- Deepin系统关于每次启动终端都要输入source /etc/profile的问题
关于每次启动终端都要输入source /etc/profile的问题 当我在Deepin系统中下载了node以及npm之后,我为了将node导入到系统文件,使用了以下命令sudo gedit ``/e ...
- 扒一扒PROMISE的原理,大家不要怕!
在前端的日常工作中,回调函数(callback)应该是见怪不怪了,但是当回调函数遇上了异步(async),这就令人发指了.那么异步是什么意思呢,简单地说就是不等你执行完,就先执行下方的代码了. 举个
- pandas处理各类表格数据
经常遇到Python读取excel和csv还有其他各种文件的内容.json还有web端的读取还是比较简单,但是excel和csv的读写是很麻烦.这里记录了pandas库提供的方法来实现文本内容和Dat ...
- spring cloud feign 坑
feign是啥? 很多人可能对于feign 不是很熟悉,可以看一下其他网友的实例分享:spring cloud feign简介 如果觉得上面这个比较难的话,还有一个简单入门的:spring cplou ...
- C语言试题(标准答案)
C语言试题(标准答案) 一.单选题(每小题2分,共20小题40分) 1.1-1.5 B D A C B 1.6-1.10 C A D B C 1.11-1.1 ...
- docker重新打包MySQL5.7镜像
1:先下载MySQL镜像 # docker pull mysql:5.7 2:运行镜像生成容器 # docker run --name mysql -p 3306:3306 -e MYSQL\_ ...
- Ubuntu 16.04安装GIMP替代PS
GIMP虽然不能完全替代PS,但是也能弥补一下. 系统默认源中已经包含了GIMP,不需要使用PPA这些. 安装: sudo apt-get install gimp 启动: 通过Dash搜索GIMP即 ...