傳送門
公式來自洛谷題解
因為求v之和與p之和的比值的最大值。這個值不超過200
考慮到二分答案,設ans為最大值,則有
可以看出是01分數規劃
那麼每次就重新分配邊的權值: ans*ci-vi
再判負環,有說明ans不成立,反之成立。
特別提一下:這裡判負環是用dfs版的spfa,而不是bfs版的,dfs版的spfa在判負環上要更快。
#include#define m 20003view code#define n 7002
#define inf 2100000001
using
namespace
std;
intread()
while(s>='
0'&&s<='9')
return x*f;
}struct
edgew[m];
intn,m;
int tot=0
; int head[n],vis[n];double
dis[n];
void add(int a,int b,int c,int
d)int spfa(int now,double
mid)}}
vis[now]=0
;
return1;
}int check(double
mid)
intmain()
for(int i=1;i<=n;++i)add(n+1,i,0,0
);
double l=0,r=200
;
double ans=0
;
while(l+0.01
if(ans==0)printf("
-1\n");
else printf("
%.1f\n
",ans);
}
模板 Spfa判負環
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你判斷圖中是否存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 如果圖中存在負權迴路,則輸出 yes 否則輸出 no 資料範圍 1 n 20...
spfa(判負環變形)
題目鏈結 題意 n種貨幣,m種交換 s v 邊 u v r1 c1 r2 c2表示u貨幣換成v貨幣需要c1手續費和交換率r1,v換u為c2,r2.轉換公式 val v val u c1 r1 初始有s貨幣v枚。問能否通過一系列的交換,可以獲得比初始更多的錢?解法 include include in...
TT 的美夢(SPFA判負環)
這一晚,tt 做了個美夢!在夢中,tt 的願望成真了,他成為了喵星的統領!喵星上有 n 個商業城市,編號 1 n,其中 1 號城市是 tt 所在的城市,即首都。喵星上共有 m 條有向道路供商業城市相互往來。但是隨著喵星商業的日漸繁榮,有些道路變得非常擁擠。正在 tt 為之苦惱之時,他的魔法小貓咪提出...