P1730 最小密度路徑 01分數規劃

2021-10-07 04:46:20 字數 1252 閱讀 3361

題目鏈結

題目大意:乙個有向無環圖(dag),邊權均為正整數。

定義一條路徑的密度為 路徑上的邊權和/邊數。

先有q組詢問,每次給出xy,求從x到y的若干條路徑中的最小路徑密度是多少。

令c為邊權,d為路徑條數

那麼所求即為:∑cd

\frac}

d∑c​

這是乙個和式分式,對於這種題目,我們通常用一種方法叫做 01分數規劃

我們二分答案,然後判斷。

判斷過程:把每條邊邊權-二分答案然後判斷最短路的正負性。

如果最短路是負的那麼答案不合法,修改r

否則修改l

下附ac**

#include

using

namespace std;

intread()

while

(s>=

'0'&&s<=

'9')

return x*f;

}const

int n=55;

int n,m;

vector<

int>v[n]

;vector<

double

>v1[n]

;double ans[n]

[n];

double dist[n]

;bool in[n]

;queue<

int>q;

bool

spfa

(int s,

int ask,

double limit)

dist[s]=0

; q.

push

(s);

in[s]=1

;while

(!q.

empty()

)}}}

return dist[ask]

>0;

}double maxn;

voidgo(

int x,

int y)

while

(r-l>

1e-6

) ans[x]

[y]=l;

return;}

intmain()

for(

int i=

1;i<=n;i++)}

int q=

read()

;for

(int i=

1;i<=q;i++

)}

P1730 最小密度路徑 floyed

給出一張有n個點m條邊的加權有向無環圖,接下來有q個詢問,每個詢問包括2個節點x和y,要求算出從x到y的一條路徑,使得密度最小 密度的定義為,路徑上邊的權值和除以邊的數量 輸入格式 第一行包括2個整數n和m。以下m行,每行三個數字a b w,表示從a到b有一條權值為w的有向邊。再下一行有乙個整數q。...

最小密度路徑 洛谷p1730

給出一張有n個點m條邊的加權有向無環圖,接下來有q個詢問,每個詢問包括2個節點x和y,要求算出從x到y的一條路徑,使得密度最小 密度的定義為,路徑上邊的權值和除以邊的數量 輸入格式 第一行包括2個整數n和m。以下m行,每行三個數字a b w,表示從a到b有一條權值為w的有向邊。再下一行有乙個整數q。...

洛谷P1730 最小密度路徑

題目大意 給定乙個 n 個點,m 條邊的有向圖,現有 q 個詢問,每次詢問 x 到 y 的最小密度路徑是多少。最小密度路徑的定義是路徑長度除以路徑邊數。題解 利用矩陣乘法,可以預處理出從 x 到 y 恰好經過 k 條邊的最短路是多少。對於每次詢問,直接處理處理即可,時間複雜度為 o n 4 注意 恰...