模板最短路方案数统计
Posted yige2019
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板最短路方案数统计相关的知识,希望对你有一定的参考价值。
审题要严密!!
#include<bits/stdc++.h> using namespace std; int head[5000000],dis[5000000],t,l,n,m,k,p,ans,duan,sum[500000]; bool sign[5000000]; struct node { int to,nxt,val; } a[5000000]; inline void add(int from,int to,int v) { a[++l].to=to; a[l].val=v; a[l].nxt=head[from]; head[from]=l; } void dijkstra() { priority_queue < pair<int,int> > q; for(int i=1; i<=n; i++) dis[i]=123456789; dis[1]=0; q.push(make_pair(0,1)); while(q.size()) { int xx=q.top().second; q.pop(); if(sign[xx])continue; sign[xx]=1; for(int i=head[xx]; i; i=a[i].nxt) { int y=a[i].to; if(dis[y]>dis[xx]+a[i].val) { dis[y]=dis[xx]+a[i].val; sum[y]=sum[xx]; q.push(make_pair(-dis[y],y)); } else if(dis[y]==dis[xx]+a[i].val) sum[y]=(sum[y]+sum[xx])%p; } } } int main() { scanf("%d",&t); for(int tt=1; tt<=t; tt++) { memset(head,0,sizeof(head)); memset(sign,0,sizeof(sign)); memset(sum,0,sizeof(sum)); scanf("%d%d%d%d",&n,&m,&k,&p); sum[1]=1; for(int i=1; i<=m; i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); } dijkstra(); printf("%d ",sum[n]%p); } return 0; }
以上是关于模板最短路方案数统计的主要内容,如果未能解决你的问题,请参考以下文章
[M最短路] lc787. K 站中转内最便宜的航班(Bellman-Ford算法模板+边数限制最短路+dp思想)