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); }