连续最短路算法(Successive Shortest Path)(最小费用最大流)
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
#define N 205
#define INF 0x3f3f3f3f
struct node {
int x, y;
node () {}
node (int x, int y) : x(x), y(y) {}
};
struct Edge {
int cap, u, v, cost;
Edge() {}
Edge(int u, int v, int cap, int cost) : u(u), v(v), cap(cap), cost(cost) {}
}edge[N*N];
vector<node> p, h;
vector<int> G[N];
int tot, dis[N], inq[N], pre[N], S, T; void AddEdge(int u, int v, int cap, int cost) {
edge[tot] = Edge(u, v, cap, cost);
G[u].push_back(tot++);
edge[tot] = Edge(v, u, , -cost);
G[v].push_back(tot++);
} int CalDis(int x1, int y1, int x2, int y2) {
return abs(x1 - x2) + abs(y1 - y2);
} bool SPFA() {
memset(inq, , sizeof(inq));
memset(dis, INF, sizeof(dis));
queue<int> que; que.push(S);
dis[S] = ; inq[S] = ;
while(!que.empty()) {
int u = que.front(); que.pop(); inq[u] = ;
for(int i = ; i < G[u].size(); i++) {
Edge &e = edge[G[u][i]];
if(e.cap > && dis[e.v] > e.cost + dis[u]) {
// 当可以增广并且费用更小的时候
dis[e.v] = e.cost + dis[u];
pre[e.v] = G[u][i]; // 记录路径
if(inq[e.v]) continue;
que.push(e.v); inq[e.v] = ;
}
}
}
return dis[T] < INF;
} void MFMC(int &mincost, int &maxflow) {
int ans = , flow = INF, p;
// 从汇点沿着此次增广的路径往回走,当找到源点的时候退出
for(int u = T; u; u = edge[p].u) {
p = pre[u]; // 找增广的流量
if(edge[p].cap < flow) flow = edge[p].cap;
}
for(int u = T; u; u = edge[p].u) {
p = pre[u];
edge[p].cap -= flow; // 更新每条边的流量
edge[p^].cap += flow;
ans += flow * edge[p].cost; // 费用 = 单位费用 * 流量
}
mincost += ans, maxflow += flow;
} int main() {
int n, m;
char s[];
while(scanf("%d%d", &n, &m), n + m) {
p.clear(); h.clear();
for(int i = ; i < n; i++) {
scanf("%s", s);
for(int j = ; j < m; j++) {
if(s[j] == 'H') h.push_back(node(i, j));
if(s[j] == 'm') p.push_back(node(i, j));
}
}
tot = ; int sz1 = p.size(), sz2 = h.size();
S = , T = sz1 + sz2 + ;
for(int i = ; i <= T; i++) G[i].clear();
for(int i = ; i < sz1; i++) // S到man
AddEdge(S, i + , , );
for(int i = ; i < sz2; i++) // house到T
AddEdge(i + + sz1, T, , );
for(int i = ; i < sz1; i++) {
for(int j = ; j < sz2; j++) {
int c = CalDis(p[i].x, p[i].y, h[j].x, h[j].y);
AddEdge(i + , j + + sz1, , c);
}
} int mincost = , maxflow = ;
while(SPFA()) MFMC(mincost, maxflow);
printf("%d\n", mincost);
}
return ;
}
连续最短路算法(Successive Shortest Path)(最小费用最大流)的更多相关文章
- SGU 185.Two shortest (最小费用最大流)
时间限制:0.25s 空间限制:4M 题意: 在n(n<=400)个点的图中,找到并输出两条不想交的最短路.不存在输出“No sulotion”: Solution: 最小费用最大流 建图与po ...
- TZOJ 4712 Double Shortest Paths(最小费用最大流)
描述 Alice and Bob are walking in an ancient maze with a lot of caves and one-way passages connecting ...
- SGU185 Two shortest(最小费用最大流/最大流)
题目求一张图两条边不重复的最短路. 一开始我用费用流做. 源点到1连容量2费用0的边:所有边,连u到v和v到u容量1费用cost的边. 总共最多会增广两次,比较两次求得的费用,然后输出路径. 然而死M ...
- 图论算法-最小费用最大流模板【EK;Dinic】
图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...
- 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流
最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...
- 经典贪心算法(哈夫曼算法,Dijstra单源最短路径算法,最小费用最大流)
哈夫曼编码与哈夫曼算法 哈弗曼编码的目的是,如何用更短的bit来编码数据. 通过变长编码压缩编码长度.我们知道普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit.但在很多情况下,数 ...
- hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))
Special Fish Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙
/** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...
- POJ 3680 Intervals 最小费用最大流(MCMF算法)
题意:给出 n ,k 表示接下来给你 n 段开区间,每段区间都有它的权值,问选出一些区间,使它的权值最大,并且在实轴上的每个点,不得超过 k次被覆盖. 思路:首先要理解建图思路,首先有一个基图,相邻点 ...
随机推荐
- js原型对象与Java类的比较
在我学习Javascript的原型对象时,我总是不自觉地拿Java的类思想来做比较,时间久了,我渐渐认识到二者有巨大的不同. 首先,类是不能直接当方法来运行,它最简便的方式是调用其静态方法:而原型对象 ...
- Thinkphp框架感悟(二)
这次主要分析一下I方法 /** * 获取输入参数 支持过滤和默认值 * 使用方法: * <code> * I('id',0); 获取id参数 自动判断get或者post * I('post ...
- Unity3D中C#和js方法相互调用
通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...
- Yii源码阅读笔记(二十二)
Module类,属性的注释和构造函数的注释: <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) ...
- my first go
package main import "fmt" func main() { var num1 int =5 for num1>0 { fmt.Println(" ...
- 使用Notepad++代替笨拙的Arduino IDE
Arduino自带的IDE 太不好用了,下面是用强大,轻量级,免费,开源,丰富插件的的Notepad++编辑器来打造Arduino开发环境 . 配置过程对新生来说可能有些繁琐,但是我尽力写的很详细了, ...
- Objective-C 编码建议
Objective-C 是 C 语言的扩展,增加了动态类型和面对对象的特性.它被设计成具有易读易用的,支持复杂的面向对象设计的编程语言.它是 Mac OS X 以及 iPhone 的主要开发语言. C ...
- PartialViewResult不鸟_ViewStart.cshtml
概述 在ASP.NET MVC中,对于Action中得到的ActionResult如果是一个ViewResult对象,那么在进行View呈现时,则会先执行_ViewStart.cshtml,然后再去执 ...
- mysql qps tps计算
Information from web QPS (Query per second) (每秒查询量)TPS(Transaction per second) (每秒事务量,如果是InnoDB会显示,没 ...
- Nhiberate (二) 搭项目
使用: visual studio 2015 ;SQL SERVER 2012. 参考.测试可用 其中有点不太一样的地儿, ISession 的泛型方法: 用了 QueryOver<>,转 ...