网络流习题



type

nettype=record

c,f:longint;

end;

notetype=record

l,p:longint;

end;

var

lt:array[0..20] of notetype;

g:array[0..20,0..20] of nettype;

n,s,t,i,j,del,max:longint;

success:boolean;

function find:longint;

var

i:longint;

begin

i:=1;

while (i<=n) and not((lt[i].l<>0) and (lt[i].p=0)) do inc(i);

if i>n then find:=0

else find:=i;

end;

function ford(var a:longint):boolean;

var

i,j,m,x:longint;

begin

ford:=true;

fillchar(lt,sizeof(lt),0);

lt[s].l:=s;

repeat

i:=find;

if i=0 then exit;

for j:=1 to n do

if (lt[j].l=0) and ((g[i,j].c<>0) or (g[j,i].c<>0)) then begin

if (g[i,j].f<g[i,j].c) then lt[j].l:=i;

if g[j,i].f>0 then lt[j].l:=-i;

end;

lt[i].p:=1;

until lt[t].l<>0;

m:=t;a:=maxlongint;

repeat

j:=m;

m:=abs(lt[j].l);

if lt[j].l<0 then x:=g[j,m].f;

if lt[j].l>0 then x:=g[m,j].c-g[m,j].f;

if x<a then a:=x;

until m=s;

ford:=false;

end;

procedure change(a:longint);

var

m,j:longint;

begin

m:=t;

repeat

j:=m;m:=abs(lt[j].l);

if lt[j].l<0 then g[j,m].f:=g[j,m].f-a;

if lt[j].l>0 then g[m,j].f:=g[m,j].f+a;

until m=s;

end;

begin

readln(n);

fillchar(g,sizeof(g),0);

fillchar(lt,sizeof(lt),0);

for i:=1 to n do

for j:=1 to n do read(g[i,j].c);

s:=1;t:=n;

repeat

success:=ford(del);

if success then begin

max:=0;

for i:=1 to n do begin

max:=max+g[i,t].f;

for j:=1 to n do

if g[i,j].f<>0 then writeln(i,‘->‘,j,‘ ‘,g[i,j].f)

end;

writeln(max);

end

else change(del);

until success;

readln;

end.

时间: 2024-07-29 18:11:30

网络流习题的相关文章

网络流相关知识点以及习题(持续更新)

首先来认识一下网络流中最大流的问题 给定一个有向图G=(V,E),把图中的边看做成管道,边权看做成每根管道能通过的最大流量(容量),给定源点s和汇点t,在源点有一个水源,在汇点有一个蓄水池,问s-t的最大水流量是多少 网络流图里,源点流出的量等于汇点流入的量,除源汇外的任何点,其流入量之和等于流出量之和 . 首先我们来看下面的图 s是源点,t是汇点 先这么想,先用dfs找出一条从s-t的路线,把他塞满,然后流量就是路径中容量最小的那条路的容量,然后把路径上的容量都剪去这个流量,再重新从s-t找可

有上下界的网络流

解决上下界网络流的一般思路: 解决这类问题的关键是如何去掉下界带来的麻烦.下面的哈工大出版的<图论及应用>里的思路. 1.网络的必要弧和构建附加网络 前一个数是下界,后一个数是上界. 下面的边是必要弧,其权值为下界.上面的边容量为上界与下界的差. 添加附加源点Y,附加汇点X (别弄错了) ,<X , Y>为的权值正无穷.对于必要弧<u , v>,添加<u,Y>,<Y,v>,容量为必要弧的容量. 删除<X, Y>,添加<T, S&

【巨坑】【网络流】线性规划与网络流24题

2016.2.21 01.飞行员配对方案问题(习题 8-10) 每一条边连接外籍-国内飞行员,显然是一个二分图,最多出发的飞机数,对应着最多的边匹配. 问题转化为经典的二分图匹配问题,可以用匈牙利或者网络流. 源点和每一个外籍飞行员.每一个国内飞行员和汇点.每个可行的配合之间连接一条容量为1的有向边. 可以派出的最多飞机数就是这个网络的最大流 建图部分代码 1 for(;;){ 2 int a,b,c; 3 a=read();b=read(); 4 if(a==-1&&b==-1) bre

C#习题大全

C#习题大全 1.String str=new String("a")和String str = "a"有什么区别? String str = "a"; 这个只是一个引用,内存中如果有“a"的话,str就指向它,如果没有才创建如后还用到"a"这个字符串的话并且是这样用: String str1 = "a"; String str2 = "a"; String str2 = &q

线性规划与网络流10 餐巾计划问题

算法实现题 8-10 餐巾计划问题(习题 8-21)?问题描述:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分:或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分:或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s<f 分.每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天

线性规划与网络流9 方格取数

算法实现题 8-9 方格取数问题(习题 8-20)?问题描述:在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.?编程任务:对于给定的方格棋盘,按照取数要求编程找出总和最大的数.?数据输入:由文件 input.txt 提供输入数据.文件第 1 行有 2 个正整数 m和 n,分别表示棋盘的行数和列数.接下来的 m行,每行有 n 个正整数,表示棋盘方格中的数.?结果输出:程序运行结束时,

数据库经典习题,

/* 数据导入: Navicat Premium Data Transfer Source Server : localhost Source Server Type : MySQL Source Server Version : 50624 Source Host : localhost Source Database : sqlexam Target Server Type : MySQL Target Server Version : 50624 File Encoding : utf-8

C/C++算法竞赛入门经典Page15 习题1-1 平均数

题目:输入3个整数,输出他们的平均值,保留3位小数. 首先,声明三个整数a,b,c和一个浮点数d: int a,b,c; double d; 输入三个整数a,b,c: scanf("%d%d%d",&a,&b,&c); 将a,b,c取平均值以后复制给d: d=(double)(a+b+c)/3; 最后输出d: printf("%.3lf",d); %.3lf表示保留3位小数的long float. 注意:不能直接这样输出: printf(&q

问题 1018: C语言程序设计教程(第三版)课后习题6.8

/******************************************************************** @file Main.cpp @date 2017-05-12 @author Zoro_Tiger @brief 问题 1018: C语言程序设计教程(第三版)课后习题6.8 http://www.dotcpp.com/oj/problem1018.html *************************************************