洛谷 P1144 最短路计数(最短路_SPFA)

传送门


数据范围看起来好像很吓人,但我还是水过去了嘻嘻
先跑一遍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));
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值