POJ3621-Sightseeing Cows
二分密度+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.