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,每个房子只能住一 ...
随机推荐
- HDU多校Round 3
Solved:4 rank:268 C. Dynamic Graph Matching 状压DP一下 #include <stdio.h> #include <algorithm& ...
- Python基础之字符的编码
参考原文 Python廖雪峰 为什么要进行编码? 计算机只能处理二进制数字(0100111),要处理文本,就必须先把文本转为数字才能处理,这个过程就叫编码. 字符的编码 ASCII编码 由于计算机是美 ...
- NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)
一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影 ...
- P1060 开心的金明(洛谷,动态规划递推,01背包轻微变形题)
题目链接:P1060 开心的金明 基本思路: 基本上和01背包原题一样,不同点在于这里要的是最大重要度*价格总和,我们之前原题是 f[j]=max(f[j],f[j-v[i]]+p[i]); 那么这里 ...
- UVA - 10603 Fill(BFS求最小值问题)
题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...
- HUST 1214 Cubic-free numbers II
Cubic-free numbers II Time Limit: 10000ms Memory Limit: 131072KB This problem will be judged on HUST ...
- 《Noisy Activation Function》噪声激活函数(一)
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51736830 Noisy Activa ...
- python函数基础:嵌套函数、作用域、匿名函数、高阶函数、递归函数
嵌套函数: 1. 函数内部可以再定义函数 2. 函数只有被调用之后才会执行 看如下代码: age = 18 def func1(): age = 22 print(age) def func2(): ...
- objective-c 通告
1. 通告和委托的区别 通告也能传递与事件相关的数据.通告不同于委托的地方在于,通告是在对象执行完成动作之后产生,而不是之前.受到通告的对象没有机会建议是否要执行动作,而且对象的通告可以有多个监听者( ...
- nyoj_518_取球游戏_201404161738
取球游戏 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个 ...