题目
https://www.luogu.org/problemnew/show/P1144
解题思路
在正常的 SPFA S P F A 算法上,加上一个 t t 数组来记录线路的条数,如果遇到了比之前的线路要短的,就更新。否则,如果相等,就直接即可。
代码
#include<cstdio>
#include<queue>
#define rep(i,x,y) for (register int i=x;i<=y;i++)
using namespace std;
const int inf=1e8,zyc=100003;
struct node{int y,next;}a[1000001];
int n,m,find[1000001],len,dis[1000001],t[1000001]; bool vis[1000001];
queue<int>que;
void add(int x,int y){a[++len]=(node){y,find[x]}; find[x]=len;}
void spfa()
{
que.push(1); vis[1]=1; dis[1]=0; t[1]=1;
while(!que.empty())
{
int u=que.front(); que.pop();
for (register int i=find[u];i;i=a[i].next)
{
int v=a[i].y;
if (dis[v]>dis[u]+1) {
dis[v]=dis[u]+1; t[v]=t[u];
if (!vis[v]){
que.push(v);
vis[v]=1;
}
} else if (dis[v]==dis[u]+1) t[v]=(t[v]+t[u])%zyc;
}
vis[u]=0;
}
}
int main()
{
scanf("%d%d",&n,&m); int x,y;
rep(i,1,n) dis[i]=inf;
rep(i,1,m) scanf("%d%d",&x,&y),add(x,y),add(y,x);
spfa();
rep(i,1,n) printf("%d\n",t[i]%zyc);
}