P2384 最短路 最短路

2022-04-07 21:54:39 字數 1276 閱讀 7382

狗哥做爛了最短路,突然機智的考了bosh一道,沒想到把bosh考住了...你能幫bosh解決嗎?

他會給你\(100000000000000000000000000000000000\)%\(10\)金幣w

給定n個點的帶權有向圖,求從1到n的路徑中邊權之積最小的簡單路徑。

第一行讀入兩個整數n,m,表示共n個點m條邊。 接下來m行,每行三個正整數x,y,z,表示點x到點y有一條邊權為z的邊。

輸出僅包括一行,記為所求路徑的邊權之積,由於答案可能很大,因此狗哥仁慈地讓你輸出它模\(9987\)的餘數即可。

廢話當然是乙個數了w

//謝fyszzhouzj指正w

對於20%的資料,\(n<=10\)。

對於100%的資料,\(n<=1000,m<=1000000\)。邊權不超過\(10000\)。

輸入 #1

3 3

1 2 3

2 3 3

1 3 10

輸出 #1

9
好好看一看再寫喲w

考慮如何將問題進行轉化, 題意是要使乘積最大, 而最短路只能處理加和最大。

取log運算,因為log單調遞增, 且乘法運算可以轉化為log的加法運算。

因此, 對路徑上的邊權進行取log運算並跑最短路。

pre[i]記錄點 i 的前驅, p_val[i]記錄點 i 與前驅所連邊的權值。

記錄答案即可。

code:

#include #include #include #include using namespace std;

const int n = 1e3 + 5, m = 1e6 + 5, mod = 9987;

int read()

int n, m, ans, cnt, head[n], vis[n], pre[n], p_val[n];

struct edge e[m];

double dis[n];

void add(int from, int to, int val)

void spfa(int s)

} }ans = 1;

int t = n;

while(t != 1)

}int main()

spfa(1);

printf("%d\n", ans);

return 0;

}

洛谷 P2384 最短路

p2384 最短路 題目提供者bosh 標籤圖論 最短路難度普及 提高 狗哥做爛了最短路,突然機智的考了bosh一道,沒想到把bosh考住了 你能幫bosh解決嗎?他會給你100000000000000000000000000000000000 10金幣w 題目描述 給定n個點的帶權有向圖,求從1到...

P2384 最短路 洛谷

狗哥做爛了最短路,突然機智的考了bosh一道,沒想到把bosh考住了.你能幫bosh解決嗎?他會給你100000000000000000000000000000000000 10金幣w 給定n個點的帶權有向圖,求從1到n的路徑中邊權之積最小的簡單路徑。輸入格式 第一行讀入兩個整數n,m,表示共n個點...

洛谷P2384 最短路

題目大意 給你乙個圖,要你求出其中1 n路徑中乘積最小的一條路 題解 用 log 2 把乘法變成加法,然後記錄每個點的前驅,最後求出答案 c code include includeusing namespace std const int mod 9987 int n,m int head 101...