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
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("%d\n",s[i]);
    return 0;
}

你可能感兴趣的:(acm,图论,算法,dijkstra)