タイトル
所与\(N- \)加重有向グラフポイントは、検索\(1 \)の\(\ N-) 、単純なパスの最小重量のパスの製品側。
モジュロ9987への答え
分析
でも最小の最小値は必ずしもないが、最終的な答えは国防省されていない前に、1辺がモジュロ最短の回答を実行中にいる場合、この質問は、トラップを設定する
に取るために、それを(\ログ\)\、追加された後の記録側、これらの最後の右側は、逓倍モジュロが答えです
(私は聞いた精度誤差ERRが、私はこのタイトルの何がやること)
コード
#include <cstdio>
#include <cctype>
#include <queue>
#include <cmath>
#define rr register
using namespace std;
const int N=1011; double dis[N];
struct node{int x,y,w,next;}e[N*100];
int ls[N],n,k=1,pre[N],v[N],t,ans; queue<int>q;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
signed main(){
n=iut();
for (rr int m=iut();m;--m){
rr int x=iut(),y=iut(),w=iut();
e[++k]=(node){x,y,w,ls[x]},ls[x]=k;
}
for (rr int i=1;i<=n;++i) dis[i]=1e18;
v[1]=1,q.push(1),dis[1]=0;
while (q.size()){
rr int x=q.front(); q.pop();
for (rr int i=ls[x];i;i=e[i].next)
if (dis[e[i].y]>dis[x]+log(e[i].w)){
dis[e[i].y]=dis[x]+log(e[i].w),pre[e[i].y]=i;
if (!v[e[i].y]) v[e[i].y]=1,q.push(e[i].y);
}
v[x]=0;
}
for (ans=1,t=n;pre[t];t=e[pre[t]].x) ans=ans*e[pre[t]].w%9987;
return !printf("%d",ans);
}