洛谷 2384 最短路

2022-09-06 17:24:10 字數 1416 閱讀 6269

【題解】

直接把鬆弛操作中dis[to]=dis[now]+e[i].dis改成dis[to]=dis[now]*e[i].dis是不行的,因為這樣做會爆long long. 同時也可以發現在最短路中我們並不能邊鬆弛邊取模,這會導致答案錯誤。

其實我們可以把邊權取個log. 因為log(m*n)=logn+logm, 所以轉化成了加法的操作,這就變成了傳統的最短路。我們在最短路中順便記錄路徑,然後再順著路徑走一遍求出邊權之積即可。

1

//luogu-judger-enable-o2

2 #include3 #include4 #include5

#define n 1010

6#define m 1000010

7#define rg register

8#define inf (1e9)

9#define ll long long

10#define mod (9987)

11using

namespace

std;

12int n,m,s,tot,last[n],pos[n],from

[n],way[n];

13 ll ans=0;14

double

dis[n];

15struct

edgee[m];

18struct

heaph[n];

22 inline int

read()

28 inline void add(int x,int y,int

z); last[x]=tot;30}

31 inline void up(int

x)37

}38 inline void down(int

x)46

else

return;47

}48}49 inline void dijkstra(int

x);51

while

(tot);

58else h[pos[to]].dis=dis[to];

59up(pos[to]);60}

61}62}

63int

main()

70 dijkstra(1

);71

int tmp=n;

72 ans=e[way[tmp]].dis%mod;

73while(tmp=from

[tmp])

78 printf("

%lld\n

",ans);

79return0;

80 }

view code

洛谷 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...