#SPFAロス最短の#2384バレー

タイトル

所与\(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);
}

おすすめ

転載: www.cnblogs.com/Spare-No-Effort/p/12355269.html