最短路计数问题

https://www.luogu.org/problemnew/show/P1144

最短路计数问题,在这里提供spfa的代码,其实计数那一部分原理都是一样的。

当你在正在处理第N条边时,他的下一条边若等于 d[n]+这条边的长度。那么会出现新的路径能到达 下一个所连得点,如果有更短的路径(路径被更新),那么便到新的 点 的路径总数为更新其的点的路径数目,每次更新的时候统计下就好了。

#include<cstdio>
#define MAXN 1000001
#define MAXE 2000001
using namespace std;
int n,m,head[MAXN],to[MAXE],nxt[MAXE],dp[MAXN],dep[MAXN],
        que[MAXN],front=0,rear=1;
bool vis[MAXN];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        to[2*i+1]=v;nxt[2*i+1]=head[u];head[u]=2*i+1;
        to[2*i+2]=u;nxt[2*i+2]=head[v];head[v]=2*i+2; 
    }
    que[front]=1;
    dep[1]=0;
    vis[1]=true;
    dp[1]=1;
    while(front<rear){
        int cn=que[front];
        for(int i=head[cn];i;i=nxt[i]){
            if(!vis[to[i]]){
                vis[to[i]]=true;
                dep[to[i]]=dep[cn]+1;
                que[rear++]=to[i];
            }
            if(dep[to[i]]==dep[cn]+1) dp[to[i]]=(dp[to[i]]+dp[cn])%100003;
        }
        front++;
    }
    for(int i=1;i<=n;i++) printf("%d\n",dp[i]);
}

猜你喜欢

转载自www.cnblogs.com/rmy020718/p/9440588.html