luoguP1730 最小密度路徑

2021-08-04 15:23:30 字數 1655 閱讀 5261



給出一張有n個點m條邊的加權有向無環圖,接下來有q個詢問,每個詢問包括2個節點x和y,要求算出從x到y的一條路徑,使得密度最小(密度的定義為,路徑上邊的權值和除以邊的數量)。

輸入格式:

第一行包括2個整數n和m。

以下m行,每行三個數字a、b、w,表示從a到b有一條權值為w的有向邊。

再下一行有乙個整數q。

以下q行,每行乙個詢問x和y,如題意所訴。

輸出格式:

對於每個詢問輸出一行,表示該詢問的最小密度路徑的密度(保留3位小數),如果不存在這麼一條路徑輸出「omg!」(不含引號)。

輸入樣例#1:

3 3

1 3 5

2 1 6

2 3 6

21 3

2 3

輸出樣例#1:

5.000

5.500

1 ≤ n ≤ 10,1 ≤ m ≤ 100,1 ≤ w ≤ 1000,1 ≤ q ≤ 1000

01分數規劃裸題

首先考慮一下二分答案ans

如果有存在

ans > σw[i] / cnt 即 σ(w[i] - ans) / cnt < 0的情況

那麼答案不合法,反之答案合法

然後spfa跑一跑就好了

**:

#include#include#include#include#includeusing namespace std;

typedef double dl;

const int inf = 2147483647;

const int maxn = 100;

struct data;

queueq;

vectore[maxn];

int n,m;

dl dis[maxn];

bool exist[maxn],vis[maxn];

dl ans[maxn][maxn];

inline int getint()

while (c >= '0' && c <= '9')

ret = ret * 10 + c - '0',c = getchar();

return ret * f;

}inline bool spfa(int s,int t)}}

}return dis[t] <= 0;

}inline void rebuild(dl x)

inline dl binary(int u,int v)

return l;

}inline bool dfs(int u,int t)

return 0;

}int main()

); }

for (int i = 1; i <= n; i++)

for (int j = 1; j <= n; j++)

ans[i][j] = binary(i,j);

}int q = getint();

for (int i = 1; i <= q; i++)

return 0;

}

luogu P1730 最小密度路徑

題目傳送門 題意 有n個點,m條邊的有向圖。現在有q個詢問,每個詢問求x y的最小密度是多少。注意 最小密度 所經過路徑的點勸和 路徑數 思路 類似於floyd的dp。f i j l 表示從點i到j的路徑經過l條路徑的點權和最小的點權和。則可知用乙個k來列舉i j的中轉點,則f i j l min ...

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。...