• .电阻网络


    3.电阻网络

    解析:

    对于每一个点都有三种情况:1.若这个点只存在于串联电路中,那么他的出度为1,下一条边的边权一定为1(题目所给条件);2.若这个点是并联电路的起点,那么他的出度为2,后两条边边权为2;  3.若这个点为此并联电路终点的前一个点,那么他出度为1,下一条边的边权为0.(并联电路的终点可以作为下一层查找的起点)。

    由此,当我们找到一条并联电路时,按照1的方式向下进行;找到一个并联电路时,按照2的方式向下进行,一直到达3的状态一个并联电路找完,用公式(R=(r1*r2)/(r1+r2)),算出这一个并联电路的总值,返回值。递归下去,直到所找的节点为n时,返回值为0;这样递归时要记录一个并联电路的终点值,便于我们dfs时从起点跳到终点,跳过整个并联电路。递推时遇到并联电路值不太好传递。

    代码实现:

     program exam;

    type

      rec=record

        f,t,d:longint;

      end;

    var

      i,j,n,m,ll,x,y,z:longint;

      ans:real;

      w:array[1..100000,1..2] of rec;

      fa:array[1..100000] of longint;

    function dfs(now:longint; var next:longint):real;

    var

      line1,line2:real;

    begin

      if now=n then

        exit(0);

      if (fa[now]=1) and (w[now,1].d=1) then

        exit(dfs(w[now,1].t,next)+1);

      if (fa[now]=2) then

      begin

        line1:=dfs(w[now,1].t,next);

        line2:=dfs(w[now,2].t,next);

        exit(((line1*line2)/(line1+line2))+dfs(next,next)); 

      end;

      if (fa[now]=1) and (w[now,1].d=0) then

      begin

        next:=w[now,1].t;

        exit(0);

      end; 

    end;

    begin

      readln(n,m);

      for i:=1 to m do

      begin

        readln(x,y,z);

        inc(fa[x]);

        w[x,fa[x]].t:=y;

        w[x,fa[x]].d:=z;

      end;

      ll:=1;

      ans:=dfs(1,ll);

      writeln(ans:0:3);

    end.

  • 相关阅读:
    AcWing 2476. 树套树(线段树套splay)
    LeetCode 1191 K 次串联后最大子数组之和
    LeetCode 668 乘法表中第k小的数
    Java003-String字符串
    云原生CD工具spinnaker部署(容器化灰度发布)
    刷题日记
    8.22 校内模拟赛 题解报告
    关于 CDQ分治(复习)
    解题营_数论
    解题营_动规
  • 原文地址:https://www.cnblogs.com/fengxiudong/p/6017315.html
Copyright © 2020-2023  润新知