二分密度+bellman-ford判断是否存在负权回路。
a,b,e分别代表每条边的起点、终点、权值,mid为当前密度,cost为点的快乐值
在二分密度时,要注意更新边权为e[i]=e[i]*mid-cost[b[i]]
[pascal 代码]
VAR
A,B,COST:ARRAY[1..100000]OF LONGINT;
DIS,E,EE:ARRAY[1..100000]OF DOUBLE;
N,M:LONGINT;
PROCEDURE INIT;
VAR
I:LONGINT;
BEGIN
READLN(N,M);
FOR I:=1 TO N DO READLN(COST[I]);
FOR I:=1 TO M DO READLN(A[I],B[I],E[I]);
EE:=E;
END;
FUNCTION BELLMAN_FORD:BOOLEAN;
VAR
I,J:LONGINT;
FLAG:BOOLEAN;
BEGIN
FILLCHAR(DIS,SIZEOF(DIS),0);
FOR I:=1 TO N DO
BEGIN
FLAG:=FALSE;
FOR J:=1 TO M DO IF DIS[A[J]]+E[J]<DIS[B[J]] THEN
BEGIN
DIS[B[J]]:=DIS[A[J]]+E[J];
FLAG:=TRUE;
END;
IF NOT FLAG THEN EXIT(TRUE);
END;
EXIT(FALSE);
END;
PROCEDURE MAIN;
VAR
L,R,MID:DOUBLE;
I:LONGINT;
BEGIN
L:=0;R:=1997;
WHILE L+1E-6<R DO
BEGIN
MID:=(L+R)/2;
FOR I:=1 TO M DO E[I]:=EE[I]*MID-COST[B[I]];
IF BELLMAN_FORD THEN R:=MID ELSE L:=MID;
END;
WRITELN(R:0:2);
END;
BEGIN
INIT;
MAIN;
END.