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 ",dp[i]); }