模板最短路方案数统计

Posted yige2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板最短路方案数统计相关的知识,希望对你有一定的参考价值。

审题要严密!!

板子

板子2

#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思想)

acwing 853. 有边数限制的最短路 模板

poj 3463 最短路与次短路的方案数求解

2019.7.30刷题统计

poj 3463 Sightseeing(次短路+条数统计)

UESTC - 1147 求最短路方案数