我是靠谱客的博主 俭朴蜜蜂,最近开发中收集的这篇文章主要介绍洛谷 P1144 最短路计数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目描述

给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。

输入输出格式
输入格式:

输入第一行包含2个正整数N,M,为图的顶点数与边数。

接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。

输出格式:

输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可。如果无法到达顶点i则输出0。

输入输出样例

输入样例#1:
5 7
1 2
1 3
2 4
3 4
2 3
4 5
4 5

输出样例#1:
1
1
1
2
4

说明

1到5的最短路有4条,分别为2条1-2-4-5和2条1-3-4-5(由于4-5的边有2条)。

对于20%的数据,N ≤ 100;

对于60%的数据,N ≤ 1000;

对于100%的数据,N ≤ 100000,M ≤ 200000。


【分析】
小水题,spfa宽搜解决。


【代码】

//洛谷 P1144 最短路计数 
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define fo(i,j,k) for(i=j;i<=k;i++)
#define M(a) memset(a,0,sizeof a)
using namespace std;
vector <int> f[100001];
int q[100001],ans[100001],c[100001];
bool vis[100001];
int main()
{
    int n,m,i,j,k,x,y,u,v;
    scanf("%d%d",&n,&m);
    fo(i,1,m)
    {
        scanf("%d%d",&x,&y);
        f[x].push_back(y);
        f[y].push_back(x);
    }
    int h=0,t=1;
    q[1]=ans[1]=c[1]=1;
    while(h<t)
    {
        u=q[++h];
        x=f[u].size()-1;
        fo(i,0,x)
        {
            v=f[u][i];
            if(c[v]==0)
            {
                c[v]=c[u]+1;
                q[++t]=v;
                ans[v]=(ans[v]+ans[u])%100003;
            }
            else if(c[v]==c[u]+1)
              ans[v]=(ans[v]+ans[u])%100003;
        }
    }
    fo(i,1,n) printf("%dn",ans[i]%100003);
    return 0;
}

最后

以上就是俭朴蜜蜂为你收集整理的洛谷 P1144 最短路计数的全部内容,希望文章能够帮你解决洛谷 P1144 最短路计数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部