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

版权声明: https://blog.csdn.net/Dawn_LLLLLLL/article/details/79947699

传送门


数据范围看起来好像很吓人,但我还是水过去了嘻嘻
先跑一遍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));
}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页