记录简单路径 并且求出路径权值的积
原题链接
下面附上模板
#include<iostream>
#include<algorithm>
#include<queue>
#include<camth>
using namespace std;
const int M=100010,N=100100;
int d[N],Next[N],edge[M],head[N],tot,ver[N],n,m;
bool v[N];
queue<int>q;
const int mod=9987;
void spfa()
{
memset(d,0x3f,sizeof(d));
memset(v,0,sizeof(v));
d[1]=0,v[1]=1;
q.push(1);//从1这个起点开始找
while(q.size()){
int x==q.frone(),q.pop();
v[x]=0;
for(int i=head[x];i;i=Next[i])
{
int y=ver[i],z=edge[i];
if(d[y]>d[x]+log(z))//将大数据经过对数运算
{
d[y]=d[x]+log(z);
po[y][0]=x,po[y][1]=z;//分别存储的是 这条边的前继,还有权值
if(!v[y])v[y]=1,q.push(y);
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
}
spfa();
int ans=1,pos=n;
while(pos!=1)
{
ans*=po[pos][1];//乘上权值
ans%=mod;
pos=po[pos][0];//找到这条边的前继
}
printf("%d\n",ans);
}