AcWing 1134. 最短路计数

给出一个n个顶m 条边的无向无权图,顶点编号为 1n.N.

问从顶点 1开始,到其他每个点的最短路有几条。

 

#include<bits/stdc++.h>
#define N 1000000
#define MOD 100003
using namespace std;
int head[N],net[N],to[N];;
int a[N],d[N],cnt[N];
int n,m,cut;
priority_queue<pair<int ,int > > dl;
void add(int from,int t){net[++cut]=head[from];to[cut]=t;head[from]=cut;}
void dij(int x)
{
    memset(d,0x3f3f3f3f,sizeof d);
    dl.push(make_pair(0,x));
    a[x]=1,d[x]=0,cnt[x]=1;
    while(dl.size())
    {
        x=dl.top().second;dl.pop();
        for(int i=head[x];i;i=net[i])
        {
            int y=to[i];
            if(d[y]==d[x]+1){cnt[y]+=cnt[x];cnt[y]%=MOD;}
            if(d[y]>d[x]+1){d[y]=d[x]+1;cnt[y]=cnt[x];dl.push(make_pair(-d[y],y));}
           
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
    }
    dij(1);
    for(int i=1;i<=n;i++)
        printf("%d\n",cnt[i]);
    return 0;
}

 

posted @ 2021-02-04 15:43  君与  阅读(70)  评论(0编辑  收藏  举报