最短路计数(模板)

模板题

bfs实现,借用dep比较路径的长度

#include<bits/stdc++.h>
#define mod 100003
#define M 2000002
#define N 1000002
using namespace std;
int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
int tot=0;
struct EDGE{
    int nextt,to;
}w[M*2];
int head[N],dep[N],num[N],vis[N];
void add(int a,int b)
{
    tot++;
    w[tot].nextt=head[a];
    w[tot].to=b;
    head[a]=tot;
}
void bfs(int s)
{
    queue<int>q;
    num[s]=1;vis[s]=1;q.push(s);
    while(!q.empty())
    {
        int x=q.front();q.pop();
        for(int i=head[x];i;i=w[i].nextt)
        {
            int v=w[i].to;
            if(!vis[v])dep[v]=dep[x]+1,num[v]=num[x],vis[v]=1,q.push(v);
            else if(dep[v]==dep[x]+1)num[v]=(num[v]+num[x])%mod;//如果走到过v,那么它的dep是dep[x]+1或更大,num是累加
            //先到达v的路径一定更短 
        }
    }
}
int main()
{
    int n=read(),m=read();
    for(int i=1;i<=m;++i)
    {
        int a=read(),b=read();
        add(a,b);add(b,a);
    }
    bfs(1);
    for(int i=1;i<=n;++i)
      printf("%d
",num[i]);
} 
View Code
原文地址:https://www.cnblogs.com/yyys-/p/11402693.html