[題解](最短路)luogu_P2384最短路

hack:

4 4 1 2 10000 2 3 10000 3 4 10000 1 4 10000

答案:13

不能邊最短路邊取模,因為取模后最大值不一定為原來最大值,所以利用log(m*n)=logm+logn

把邊權取log跑最短路,記錄路徑,最後邊乘邊取模


#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
const int maxm=1000010;
const int mod=9987;
int n,m;
struct node{
    int v,w,nxt;
}e[maxm];
int head[maxn],cnt;
void add(int u,int v,int w){
    e[++cnt].v=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
}
int pa[maxn][2],v[maxn];
double d[maxn];
void spfa(){
    for(int i=1;i<=n;i++)d[i]=100000000.0;
    queue<int>q;
    d[1]=0;v[1]=1;q.push(1);
    while(!q.empty()){
        int x=q.front();q.pop();v[x]=0;
        for(int i=head[x];i;i=e[i].nxt){
            int y=e[i].v,z=e[i].w;
            if(d[y]>d[x]+log(z)){
                d[y]=d[x]+log(z);
                pa[y][0]=x,pa[y][1]=z;
                if(!v[y])q.push(y),v[y]=1;
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1,u,v,w;i<=m;i++){
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    spfa();
    int ans=1,pos=n;
    while(pos!=1){
        ans*=pa[pos][1];
        ans%=mod;
        pos=pa[pos][0];
    }
    printf("%d",ans);
    
}

 

posted @ 2019-04-23 21:42  羊肉汤泡煎饼  阅读(124)  评论(0编辑  收藏  举报