codevs 草地排水问题 网络流

题目描述 Description

在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水。这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。

农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。需要注意的是,有些时候从一处到另一处不只有一条排水沟。

根据这些信息,计算从水潭排水到小溪的最大流量。对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。

输入描述 Input Description

第1行: 两个用空格分开的整数N (0 <= N <= 200) 和 M (2 <= M <= 200)。N是农夫John已经挖好的排水沟的数量,M是排水沟交叉点的数量。交点1是水潭,交点M是小溪。

第二行到第N+1行: 每行有三个整数,Si, Ei, 和 Ci。Si 和 Ei (1 <= Si, Ei <= M) 指明排水沟两端的交点,雨水从Si 流向Ei。Ci (0 <= Ci <= 10,000,000)是这条排水沟的最大容量。

输出描述 Output Description

输出一个整数,即排水的最大流量。

样例输入 Sample Input
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
样例输出 Sample Output

50

分析:

模版的dinic算法,找个模版bfsdinic就好了。

代码:

const
  maxn=200;
  maxm=400;
  inf=100000000;


var
  v,r,next:array [1..maxm] of longint;
  first,now,q,dis:array [1..maxn] of longint;
  n,m,x,y,w,i,ans:longint;


procedure addedge(i,x,y,w:longint);
begin
  v[i]:=y;
  r[i]:=w;
  if first[x]<>0 then
    next[i]:=first[x];
  first[x]:=i;
end;


function check:boolean;
var
  head,tail,i,x,y:longint;
begin
  for i:=1 to n do
    dis[i]:=-1;
  head:=0;tail:=1;q[1]:=1;dis[1]:=0;
  while head<tail do
    begin
      inc(head);
      x:=q[head];i:=first[x];
      while i<>0 do
        begin
          y:=v[i];
          if (r[i]>0) and (dis[y]<0) then
            begin
              dis[y]:=dis[x]+1;
              inc(tail);q[tail]:=y;
              if y=n then
                exit(true);
            end;
          i:=next[i];
        end;
    end;
  exit(false);
end;


function try(u,min:longint):longint;
var
  i,y,mi:longint;
begin
  if u=n then
    exit(min);
  i:=now[u];
  while i<>0 do
    begin
      y:=v[i];
      if (r[i]>0) and (dis[y]=dis[u]+1) then
        begin
          if r[i]>min then
            mi:=min
          else
            mi:=r[i];
          mi:=try(y,mi);
          if mi>0 then
            begin
              dec(r[i],mi);
              if i mod 2=1 then
                inc(r[i+1],mi)
              else
                inc(r[i-1],mi);
              exit(mi);
            end;
        end;
      i:=next[i];
    end;
  exit(0);
end;


procedure Dinic;
var
  i:longint;
begin
  while check do
    for i:=1 to 2*m do
      now[i]:=first[i];
end;


begin
  readln(m,n);
  for i:=1 to m do
    begin
      readln(x,y,w);
      addedge(2*i-1,x,y,w);
      addedge(2*i,y,x,0);
    end;
  dinic;
  ans:=0;
  i:=first[n];
  while i<>0 do
    begin
      ans:=ans+r[i];
      i:=next[i];
    end;
  writeln(ans);
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
遗传算法是一种通过模拟生物遗传和进化机制来解决优化问题的算法。针对给排水问题,可以将问题转化为一个优化问题,即找到最优的给排水方案,使得目标函数最小化或最大化。 首先,需要定义给排水问题的目标函数和约束条件。目标函数可以是一些衡量给排水系统性能的指标,如成本、能耗、水质等。约束条件可以涉及到管道的量、压力、速度限制,以及污水处理要求等。 接下来,可以使用遗传算法来搜索最优解。遗传算法的基本程包括初始化种群、选择、交叉、变异和适应度评估等步骤。具体地,可以按照以下步骤进行优化: 1. 初始化种群:随机生成一组初始解作为种群。 2. 适应度评估:根据定义的目标函数和约束条件,对每个个体计算适应度值。 3. 选择:根据适应度值选择优良个体,可以使用轮盘赌或排名选择等方法。 4. 交叉:从选择的个体中随机选择两个个体进行交叉操作,生成新的子代个体。 5. 变异:对子代个体进行变异操作,引入一定的随机性。 6. 适应度评估:对新生成的子代个体进行适应度评估。 7. 判断终止条件:判断是否满足终止条件,如达到最大迭代次数或找到满足要求的解。 8. 如果满足终止条件,则输出最优解;否则,返回第3步。 通过不断迭代以上步骤,遗传算法可以逐渐搜索到较优的给排水方案。 需要注意的是,给排水问题的复杂性可能需要考虑更多的因素和约束条件,例如地形、污水负荷变化等。因此,在应用遗传算法之前,需要对问题进行合理的建模和参数设置,以及对结果进行验证和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值