洛谷 P2384 最短路

2022-02-13 05:23:08 字數 2122 閱讀 4487

p2384 最短路

題目提供者bosh

標籤圖論 最短路難度普及/提高-

狗哥做爛了最短路,突然機智的考了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

說明

/*

直接spfa暴力.

資料很水.

如果邊權值大一點就不能這樣搞了.

*/#include

#include

#include

#include

#define mod 9987

#define maxm 1000001

#define maxn 1001

using

namespace

std;

int n,m,g[maxn][maxn],head[maxn],cut,pre[maxn],ans=1;

bool b[maxn];

long

long dis[maxn];

struct datae[maxm];

int read()

while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();

return x*f;

}void add(int u,int v,int z)

void spfa()}}

}int main()

spfa();

printf("%d",dis[n]%mod);

return

0;}

/*

單源詢問兩點之間最小積路.

比較好的一種做法.

然後用log性質.

log(n*m)=log(n)+log(m)

然後我想最後取2的dis[n]次方作為ans.

但是因為double的緣故這個ans是錯誤的.

so我們在保證正確性的情況下記錄路徑求ans.

*/#include

#include

#include

#include

#define mod 9987

#define maxm 1000001

#define maxn 1001

using

namespace

std;

int n,m,g[maxn][maxn],head[maxn],cut,pre[maxn],ans=1;

bool b[maxn];

double dis[maxn];

struct datae[maxm];

int read()

while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();

return x*f;

}void add(int u,int v,int z)

void spfa()}}

}int main()

spfa();

x=n;

while(pre[x])

printf("%d",ans);

return

0;}

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

洛谷P2384 最短路 題解

請你求出從1到n的最短路徑,其中最短路徑 這條路經過的邊的權值的乘積。很顯然,這也是一道經典的單元最短路問題,首先我們可以考慮使用floyd,顯然,這是乙個比較無腦簡單的最短路演算法,而且包治負邊權等等。但是時間複雜度太高,可達o n3 o n 3 o n3 這道題目看起來可能是剛剛好,但據說會被卡...