给一幅图,求乘积最短的路径。
把乘积取对数就能变成普通的最短路。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include <bits/stdc++.h> using namespace std; const int M = 1e6+7; const double inf = 2147483647; const int mod = 9987; int cnt,n,m,head[1007],flag[1007]; struct edge { int v,w,next; }e[M]; void init(){ cnt=0;memset(head,-1,sizeof(head)); } void add(int u,int v,int w){ e[++cnt].v=v;e[cnt].w=w;e[cnt].next=head[u]; head[u]=cnt; } struct node { int index,pre,w; double dis; bool operator < (const node &k)const{ return dis>k.dis; } }d[1007]; priority_queue<node> q; void dijkstra(int s){ for(int i=1;i<=n;i++) d[i].dis=inf,d[i].index=i,flag[i]=0,d[i].pre=-1; d[s].dis=0;q.push(d[s]); while(!q.empty()){ int u=q.top().index; q.pop(); if(flag[u]) continue; flag[u]=1; for(int i=head[u];~i;i=e[i].next){ int v=e[i].v,w=e[i].w; //cout<<v<<" "<<w<<endl; if(d[v].dis>d[u].dis+(double)log(w)){ d[v].dis=d[u].dis+(double)log(w); d[v].pre=u;d[v].w=w; q.push(d[v]); } } } int res=1,p=n; while(p!=1){ res=(res*d[p].w)%mod; p=d[p].pre; } printf("%d\n",res); } int main(){ init(); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int from,to,val; scanf("%d%d%d",&from,&to,&val); add(from,to,val); } dijkstra(1); return 0; }