码迷,mamicode.com
首页 > 其他好文 > 详细

【模板】最短路方案数统计

时间:2019-11-12 19:52:23      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:lin   tin   amp   its   main   top   ref   node   turn   

审题要严密!!

板子

板子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\n",sum[n]%p);
    }
    return 0;
}

 

【模板】最短路方案数统计

标签:lin   tin   amp   its   main   top   ref   node   turn   

原文地址:https://www.cnblogs.com/yige2019/p/11844520.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!