记录简单路径 并且求出路径权值的积

记录简单路径 并且求出路径权值的积

原题链接
下面附上模板

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

猜你喜欢

转载自www.cnblogs.com/arbor-one/p/12693910.html