我是靠谱客的博主 爱笑黑裤,最近开发中收集的这篇文章主要介绍P1144 最短路计数P1144 最短路计数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本人也是初学最短路,欢迎交流。

关于dijkstra

P1144 最短路计数

原题链接:传送门

思路:

  1. 简单的dij计数,基本思想是dij中的松弛操作,这里假设d[]为距离,s[]为最短路路径数。
  2. if d[v]>d[u]+w ,则 s[v] =s[u]; 如果最短路得到更新,则用s[u]的路径更新s[v];
  3. if d[v]=d[u]+w , 则 s[v]+=s[u]; 如果同样是最短路,则s[v]的最短路数加上s[u]得到更新。

    代码如下:
#include<bits/stdc++.h>
using namespace std;
const int manx=1e6+5;
const int mamx=2e6+5;
const int mod=100003;
int head[manx],d[manx],s[manx];
bool vis[manx];
int n,m,k=0;
struct node{
    int v,next;
}a[mamx];
void add(int u,int v)
{
    a[++k].next=head[u];
    a[k].v=v;
    head[u]=k;
}
priority_queue<pair<int,int> >q;
void dij()
{
    for(int i=1;i<=n;i++) d[i]=1e9,vis[i]=0,s[i]=0;
    q.push(make_pair(0,1));
    d[1]=0;
    s[1]=1; //路径数初始化为1
    while(q.size())
    {
        int u=q.top().second;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=head[u];i;i=a[i].next)
        {
            int v=a[i].v;
            if(d[v]>d[u]+1) d[v]=d[u]+1,s[v]=s[u]%mod,q.push(make_pair(-d[v],v));
            else if(d[v]==d[u]+1) s[v]=(s[v]+s[u])%mod;
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    dij();
    for(int i=1;i<=n;i++)
        printf("%dn",s[i]);
    return 0;
}

最后

以上就是爱笑黑裤为你收集整理的P1144 最短路计数P1144 最短路计数的全部内容,希望文章能够帮你解决P1144 最短路计数P1144 最短路计数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部