• JZOJ_4735. 最小圈 (Standard IO)


    Description

    对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点,那么一个圈的平均值为圈上k条边权的和除以k,现要求其中的最小值

    Input

    第一行2个正整数,分别为n和m
       以下m行,每行3个数,表示边连接的信息

    Output

    一行一个数,表示最小圈的值。你的答案被视为正确当且仅当与标准答案的绝对误差不超过1e-5

    Solution

    新思想:分数规划,将求值问题变成可行性判断问题。

    然后要利用深搜版的 SPFA或者dfs,用于判负环,来求可行性,如果是宽搜版的会被卡 TLE。

    代码

     1 type
     2   arr=record
     3     y,next:longint;
     4     w:real;
     5   end;
     6 var
     7   bo:boolean;
     8   n,m,nm:longint;
     9   a:array [0..10001] of arr;
    10   d:array [0..3001] of real;
    11   ls,v:array [0..3001] of longint;
    12 procedure add(x,y:longint;z:real);
    13 begin
    14   inc(nm);
    15   a[nm].y:=y; a[nm].w:=z;
    16   a[nm].next:=ls[x]; ls[x]:=nm;
    17 end;
    18 
    19 procedure init;
    20 var
    21   i,x,y:longint;
    22   z:real;
    23 begin
    24   readln(n,m);
    25   nm:=0;
    26   for i:=1 to m do
    27     begin
    28       readln(x,y,z);
    29       add(x,y,z);
    30     end;
    31 end;
    32 
    33 procedure dfs(x:longint;mid:real);
    34 var
    35   i:longint;
    36 begin
    37   v[x]:=1; i:=ls[x];
    38   while i<>0 do
    39     with a[i] do
    40       begin
    41         if d[x]+w-mid<d[y] then
    42           begin
    43             if v[y]=1 then
    44               begin
    45                 bo:=true;
    46                 exit;
    47               end;
    48             d[y]:=d[x]+w-mid;
    49             dfs(y,mid);
    50             if bo then exit;
    51           end;
    52         i:=next;
    53       end;
    54   v[x]:=0;
    55 end;
    56 
    57 function pd(mid:real):boolean;
    58 var
    59   i:longint;
    60 begin
    61   for i:=1 to n do
    62     begin
    63       d[i]:=0; v[i]:=0;
    64     end;
    65   for i:=1 to n do
    66     begin
    67       bo:=false;
    68       dfs(i,mid);
    69       if bo then exit(true);
    70     end;
    71   exit(false);
    72 end;
    73 
    74 procedure main;
    75 var
    76   l,r,mid:real;
    77 begin
    78   l:=-100000; r:=100000;
    79   while r-l>=0.0000001 do
    80     begin
    81       mid:=(l+r)/2;
    82       if pd(mid) then r:=mid
    83                  else l:=mid;
    84     end;
    85   writeln(mid:0:6);
    86 end;
    87 
    88 begin
    89   init;
    90   main;
    91 end.
  • 相关阅读:
    linux ssh免密
    flink WaterMark之TumblingEventWindow
    flink 并行计数器实现
    VSCode删除重复的空行
    Gnome添加Open with Code菜单
    Linux下设置VSCode为默认的文本编辑器
    Jupyter Notebook添加Ruby支持
    Linux下无法运行Color picker
    oh-my-zsh: bracketed-paste-magic:zle:47: not enough arguments for -U
    Vim auto-pairs设置选项
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9530826.html
Copyright © 2020-2023  润新知