数据范围看起来好像很吓人,但我还是水过去了嘻嘻
先跑一遍SPFA确定最短路长度,然后用记忆化搜索累加答案(点1到点1的答案为1,然后递归搜索,如果下一个点在最短路径上,我就把我的答案加上它的答案)
Code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
struct node{int x,y,next;}a[4000010];
int n,m,len,st,ed;
int first[1000010],q[1000010],f[1000010],ans[1000010];
void ins(int x,int y) {len++;a[len].x=x;a[len].y=y;a[len].next=first[x];first[x]=len;}
int dfs(int x)
{
if(ans[x]) return ans[x];
for(int i=first[x];i;i=a[i].next)
if(f[x]-1==f[a[i].y])//如果这条边在最短路径上
ans[x]=(ans[x]+dfs(a[i].y))%100003;
return ans[x];
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
ins(x,y);ins(y,x);
}
memset(q,0,sizeof(q));q[1]=1;
memset(f,63,sizeof(f));f[1]=0;
st=1;ed=2;
while(st!=ed)
{
int x=q[st];
for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(f[y]>f[x]+1)
{
f[y]=f[x]+1;
q[ed++]=y;
}
}
st++;
}
ans[1]=1;
for(int i=1;i<=n;i++)
printf("%d\n",dfs(i));
}