c++最短路计数(acwing版)

2023-09-19 11:34:15

先看题目:

给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1 到 N。

问从顶点 1 开始,到其他每个点的最短路有几条。

输入格式

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

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

输出格式

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

如果无法到达顶点 i 则输出 0。

数据范围

1≤N≤10^5,
1≤M≤2×10^5

输出样例:

5 7
1 2
1 3
2 4
3 4
2 3
4 5
4 5

输出样例:

1
1
1
2
4

代码如下

#include <cstring>
#include <iostream>
#include <algorithm>
#include<queue>

using namespace std;

const int N = 100010, M = 400010, mod = 100003;

int n, m;
int h[N], e[M], ne[M], idx;
int dist[N], cnt[N];

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void bfs()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    cnt[1] = 1;

    queue<int> q;
    q.push(1);

    while (q.size())
    {
        auto t = q.front();
        q.pop();

        for (int i = h[t]; ~i; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > dist[t] + 1)
            {
                dist[j] = dist[t] + 1;
                cnt[j] = cnt[t];
                q.push(j);
            }
            else if (dist[j] == dist[t] + 1)
            {
                cnt[j] = (cnt[j] + cnt[t]) % mod;
            }
        }
    }
}

int main()
{
    scanf("%d%d", &n, &m);
    memset(h, -1, sizeof h);

    while (m -- )
    {
        int a, b;
        scanf("%d%d", &a, &b);
        add(a, b), add(b, a);
    }

    bfs();

    for (int i = 1; i <= n; i ++ ) printf("%d\n", cnt[i]);

    return 0;
}

1、双向边,而且建图的时候不需要权值

2、用bfs来做,因为bfs就是可以求最短路,而且一层一层的搜索,所以从顶点到每个边的最短路数量用cnt数组存储

3、如果距离增大,就直接继承前一个点的数量(因为相当于权值都是为1)

4、如果距离一样,就把当前点和可以到达下个点的最短路数量相加

更多推荐

[2023.09.15]: Yew SSR模式下的条件编译问题

昨天才写了Rust的条件编译,没想到这个问题还没完。昨天我还为它的强大而赞叹不已,自以为对它了解了八九成,然而今天我才猛然意识到,这个里面的深度远超我的想象。我估计,我现在只了解其中的冰山一角吧。故事从客户端post数据的后端api说起。习以为常的思维影响着我解决问题的方式,对于这种问题,我通常会寻找一个库来处理后端的

(入门向)面向萌新的算法比赛入门指南

什么是算法算法是指解决问题或完成特定任务的一系列明确指令或步骤集合。它是一个定义良好、逐步执行的操作序列,用于将输入转换为输出。算法可用于计算、数据处理、自动化控制、问题解决等各个领域。算法通常由一系列简单的操作组成,这些操作可以是基本的数学运算、逻辑判断、条件分支、循环控制等。通过组合和重复执行这些操作,算法能够解决

大模型从入门到应用——LangChain:代理(Agents)-[工具包(Toolkit)]

分类目录:《大模型从入门到应用》总目录LangChain系列文章:基础知识快速入门安装与环境配置链(Chains)、代理(Agent:)和记忆(Memory)快速开发聊天模型模型(Models)基础知识大型语言模型(LLMs)基础知识LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(HumanInpu

数据结构——红黑树

1.什么是红黑树?红黑树是一种特定类型的二叉树,用于组织数据。它是一种平衡二叉查找树(AVL树)的变体,每个结点都带有颜色属性(红色或黑色)。在红黑树中,从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。具体来说,红黑树满足以下性质:每个结点要么是红色,要么是黑色。根结点是黑色。每个叶结点(NIL或空结点)是黑色

PHP8的类与对象的基本操作之类的实例化-PHP8知识详解

定义完类和方法后,并不是真正创建一个对象。类和对象可以描述为如下关系。类用来描述具有相同数据结构和特征的“一组对象”,“类”是“对象”的抽象,而“对象”是“类”的具体实例,即一个类中的对象具有相同的“型”,但其中每个对象却具有各不相同的“值”。例如,人就是一个抽象概念,即人类,但是程序员小张就是人类中具体的一个实例,即

TSINGSEE视频AI智能分析技术:水泥厂安全生产智能监管解决方案

一、方案背景随着人工智能技术的快速发展以及视频监控系统在全国范围内的迅速推进,基于AI视频智能分析技术的智能视频监控与智慧监管系统,也已经成为当前行业的发展趋势。在工业制造与工业生产领域,工厂对设备的巡检管理、维护维修、资产管理、安全运行管理等方面也提出了更高的监管要求。二、方案介绍TSINGSEE青犀视频围绕AI算法

网络安全(黑客)自学笔记

前言作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。计算机各领域的知识水平决定你渗透水平的上限。【1】比如:你编程水平高,那你在代码审计的时候就会比别人强,写出的漏洞利用工具就会比别人的好用;【2】比如:你数据库知识水平高,那你在进行SQL注入攻击的时候,你就可以写出更多更好的SQL注入语句

【算法】算法设计与分析 课程笔记 第一章 概述

第一章算法概述算法的性质算法的四个性质:输入、输出、确定性和有穷性。算法的时间复杂度1.常见的时间复杂度常数阶O(1)对数阶O(logn)线性阶O(n)线性对数阶O(nlogn)平方阶O(n^2)立方阶O(n^3)k次方阶O(n^k)指数阶O(2^n)注:上面的logn均代表以2为底的对数。2.时间复杂度排序常见的算法

【web开发】10、数据统计(echarts)--柱状图、折线图、饼图

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、echarts是什么?二、使用步骤1.引入CDN2.设置高度&宽度3.后端4.前端前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础

CAD丢失mfc140u.dll怎么办,mfc140u.dll丢失的解决方法分享

许多用户在运行AutoCAD时可能会遇到一个问题:丢失mfc140u.dll文件,导致软件无法正常运行。本文将详细介绍mfc140u.dll文件的作用,以及如何解决丢失mfc140u.dll文件的问题。一、mfc140u.dll文件的作用MFC(MicrosoftFoundationClass)是一个由微软公司开发的C

量子计算基础知识—Part1

1.什么是量子计算机?量子计算机是基于量子力学原理构建的机器,采用了一种新的方法来处理信息,从而使其具有超强的功能。量子计算机使用Qubits处理信息。2.什么是量子系统?一个量子系统指的是由量子力学规则描述和控制的物理系统。在量子力学中,物理系统的状态不再是经典物理中的确定性值,而是由一个称为波函数的数学对象描述的概

热文推荐