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.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值