[POJ2135]最小费用最大流
一直由于某些原因耽搁着...最小费用最大流没有搞会。
今天趁着个人状态正佳,赶紧去看看,果然30min不到看会了算法+模板并且A掉了一道题。
感觉最小费用最大流在学过了最大流之后还是挺好理解的。找到从起点到终点流过1单位流量的最小花费方案,然后更新数据。
不停地找增广路,不停累计答案,不停趋近最优解。
理解起来没有任何问题。代码书写一遍就过了很顺利。
POJ2135
实际上是一道并不那么容易套的模板题。
网络流的题目重在建模。这道题就是这样。
求起点到终点往返的最短路径,但不能经过相同的边。
往返一遍等同于从起点到终点走两遍。
乍一看觉得很像二取方格数,然后想到了最近A掉的K取方格数,就是用网络流算法。于是想到了网络流。
我们用流量为1来控制每条边只经过一次,然后增加一个源点和汇点,分别连0,n流量为2。
这样建模就建好啦!
但是刚刚想到了一个问题,来回两次的边都赋予了1的流量,这样不是可以来回各经过一次吗?
即这种情况。

红-蓝-绿-黄是一条已经取好的路径。
当橙色边费用接近正无穷的时候,橙色点就会到绿-蓝-紫-黄
这样就经过了绿边两次。
但是很快发现这样的情况是不存在的。
完全可以取红-蓝-紫+红-橙-绿-黄,这样还减少了两条绿边的费用。题目中保证费用>0,所以这时我们可以发现这样的情况是不存在的。
于是代码就可以放心地敲起来啦!
(本来想再做几道最小费用最大流的题练练代码熟练度的,但由于时间比较紧...突然发现今天是周五,省选周一报到...本来印象中的还有三四天没想到是周末QAQ 然后得知明天下午还放假这样一来就根本没有
时间可以准备啦!所以鉴于这些原因...还是多留点时间给复习不熟练的东西吧)
program poj2135;
const maxn=;maxm=;
var n,m,i,j,x,y,z:longint;
link,opt,dis,pre:array[-..maxn]of longint;
vis:array[-..maxn]of boolean;
fa,from,next,w,c,rev:array[-..maxm]of longint; function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end; procedure add(x,y,z,cc:longint);
begin
inc(j);fa[j]:=y;from[j]:=x;next[j]:=link[x];link[x]:=j;w[j]:=z;c[j]:=cc;rev[j]:=j+;
inc(j);fa[j]:=x;from[j]:=y;next[j]:=link[y];link[y]:=j;w[j]:=-z;c[j]:=;rev[j]:=j-;
end; function spfa:boolean;
var head,tail,x,j:longint;
begin
fillchar(dis,sizeof(dis),);
fillchar(vis,sizeof(vis),true);
head:=;tail:=;
opt[]:=;vis[]:=false;dis[]:=;
while head<>tail do
begin
head:=(head+) mod maxn;
x:=opt[head];j:=link[x];
while j<> do
begin
if (c[j]>)and(dis[x]+w[j]<dis[fa[j]]) then
begin
dis[fa[j]]:=dis[x]+w[j];
pre[fa[j]]:=j;
if vis[fa[j]] then
begin
tail:=(tail+) mod maxn;
opt[tail]:=fa[j];
end;
end;
j:=next[j];
end;
vis[x]:=true;
end;
if dis[n+]<>dis[-] then exit(true) else exit(false);
end; function MCMF:longint;
var ans,x,sum:longint;
begin
ans:=;
while spfa do
begin
sum:=maxlongint;
x:=n+;
while x<> do
begin
sum:=min(sum,c[pre[x]]);
x:=from[pre[x]];
end;
x:=n+;
while x<> do
begin
inc(ans,sum*w[pre[x]]);
dec(c[pre[x]],sum);
inc(c[rev[pre[x]]],sum);
x:=from[pre[x]];
end;
end;
exit(ans);
end; begin
assign(input,'poj2135.in');reset(input);
readln(n,m);j:=;
for i:= to m do
begin
readln(x,y,z);
add(x,y,z,);add(y,x,z,);
end;
add(,,,);add(n,n+,,);
writeln(MCMF);
end.
[POJ2135]最小费用最大流的更多相关文章
- POJ2135 最小费用最大流模板题
练练最小费用最大流 此外此题也是一经典图论题 题意:找出两条从s到t的不同的路径,距离最短. 要注意:这里是无向边,要变成两条有向边 #include <cstdio> #include ...
- poj2135最小费用最大流经典模板题
Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13509 Accepted: 5125 Descri ...
- POJ2135 Farm Tour —— 最小费用最大流
题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- POJ 2135 Farm Tour (最小费用最大流模板)
题目大意: 给你一个n个农场,有m条道路,起点是1号农场,终点是n号农场,现在要求从1走到n,再从n走到1,要求不走重复路径,求最短路径长度. 算法讨论: 最小费用最大流.我们可以这样建模:既然要求不 ...
- POJ 2135 Farm Tour (网络流,最小费用最大流)
POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
- bzoj1927最小费用最大流
其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→ =_=你TM逗我 刚要删突然感觉dinic的模 ...
- ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)
将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
随机推荐
- Django admin源码剖析
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- Qt 隐藏标题栏可移动升级版
在最出的时候,在Qt程序隐藏标题栏的情况下,实现界面可拖拽移动,是鼠标在在程序界面的任意位置都可以,现在这个版本是需要鼠标在程序界面的特定位置开可以 上代码 static QPoint last(0, ...
- 让PC版网站在移动端原样式显示
一般PC网站在移动端显示效果往往和PC版原样式不同,为了在移动端下还原原PC站样式,可以采用以下方式解决: 1) 去掉页头的: <meta name="viewport" c ...
- Python全栈 MongoDB 数据库(聚合、二进制、GridFS、pymongo模块)
断网了2天 今天补上 聚合操作: 对文档的信息进行整理统计的操作 返回:统计后的文档集合 db.collection.aggregate() 功能:聚合函数,完成聚合操作 参数:聚合条件,配 ...
- python--基础篇二
一. 格式化输出 :name=input("name:") age=input("age:") hobby=input("hobbie:") ...
- (转) Unreal Engine 4 Custom Shaders Tutorial
说明: 1.这里的Custom Shaders 为且仅为 Custom Node的使用和USF的包含.并非全局Shader和Material Shader. 2.原文来源:https://www.ra ...
- LeetCode - 20. Valid Parentheses(0ms)
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- C++的几种字符类型
我们在C学过了char字符类型. 在C++中,char是基本的字符类型,但却不仅仅有这一种字符类型! 类型 含义 该类型数据所占的最小比特位数 char 字符 8位(即可表示28个字符) wchar_ ...
- 【WebService】——SOAP、WSDL和UDDI
WebService的三要素:SOAP.WSDL和UDDI.soap用来描述传递信息的格式,wsdl描述如何访问具体的接口,uddi管理.分发查询WebService. 1.SOAP SOAP Sim ...
- OSCache页面缓存的使用
完成项目时,为了减少对数据库的频繁操作,引出了缓存,缓存分为以下几种: 1.一级缓存 一级缓存的存储域是session,作用于单个的dao 2.二级缓存 二级缓存的存储域是sessionFactory ...