[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, ...
随机推荐
- L009文件属性知识详解小节
本堂课分为5部分内容 1.linux下重要目录详解 2.PATH变量路径内容 3.linux系统中文件类型介绍 4.linux系统中文件属性详细介绍 5.linux系统文件属性inode与block知 ...
- thrift 调取 python php go 客户端代码
golang package main import ( "fmt" "git.apache.org/thrift.git/lib/go/thrift" &qu ...
- Qt 汽车仪表 QWidget
今天是2016年的最后一个工作日,在这个最后工作日里面,和以为网友要了一点练手的素材文件,经过网友确认,不涉及商业机密,在这里分享一下,如侵权,请联系我删除. 先上程序运行图 这里显示数字,闪烁等都没 ...
- Qt 实时读串口数据,并将读到的数据从网口发送出去
需求: 1. 要试试从串口读取数据 2. 将读到的数据从网口发送出去 3.开机启动 4. 没有界面 第一部分 配置Qt Pro文件 需要Qt += serialport network 第二部分 - ...
- python 基础篇 16 递归和二分数查找与编码补充回顾
编码回顾补充: 回顾编码问题: 编码相当于密码本,关系到二进制与看懂的文字的的对应关系. 最早期的密码本: ascii码:只包含英文字母,数字,特殊字符. ...
- K-Means和FCM聚类
K均值聚类是基于原型的.划分的聚类方法.聚类数K由用户指定,初始的K个聚类中心随机选取,然后将每个点分派到最近的聚类中心,形成K个簇,接下来重新计算每个簇的聚类中心,重复上一步,直到簇不发生变化或达到 ...
- ASP.NET CORE 2.0 文档中文正式版已经出来了
https://docs.microsoft.com/zh-cn/aspnet/core/
- java--List转换成json格式
方法一 首先导入jar包,json-rpc-1.0.jar public class List2Json { public static JSONArray ProLogList2Json(List& ...
- windows redis+lua的调试
1.编写lua脚本my.lua local key = KEYS[1] --限流KEY(一秒一个) local limit = tonumber(ARGV[1]) --限流大小 local curre ...
- pptp协议的工作原理
我的工作机是A,通信网卡是Aeth0, Appp0: 然后我的云主机是B, 通信的网卡是Beth0, Bppp0: 在网卡Bppp0上会不断地很清晰的数据包: 16:40:39.522917 IP 6 ...