(实时更新)蓝桥杯知识点笔记 | (九)图论

蓝桥杯备赛指南 背景 可能是因为新的一年蓝桥杯报名开始了,所以最近有很多小伙伴私聊我,问该如何训练,训练到什么地步可以拿奖,所以我想再补充一些关于具体训练内容的东西来帮助大家训练.我也是第二次参加蓝桥杯了,第一次也是拿到了国家二等奖(B组),对这部分内容有兴趣的同学也可以去看看我之前写的一篇博客. 考点 既然要参加蓝桥杯那对它的考试内容当然要相当了解了.这一部分可以在蓝桥杯官网查看我这里也会为大家进行一个总结.其实蓝桥杯作为算法竞赛考点与ACM差不多,主要包括但不限于以下两个部分 1.计算机算法:枚举、排序、搜索、计数、贪 阅读详情

小标题的超链接为原题链接,点击跳转

8. 图论

最短路问题(shortest-path problem)是图论中的经典问题之一,可用来解决管路铺设、线路安装、厂区布局和设备更新等实际问题。

基本内容是:假设网络中的每条边都有一个 权重(常用长度、成本、时间等表示),最短路问题的目标是找出 给定两点(通常是源节点和汇节点)之间总权重之和最小的路径。

8.1 遍历

acwing845树的重心

题目

image-20230329205134893

代码

 // 树的重心
#include <iostream>
#include <cstring>
using namespace std;

const int N = 1E5+10, M = N*2;

int h[N], e[M], ne[M], idx;
bool st[N];
int n;
int ans = N;

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

int dfs(int u)
{
	st[u] = true;

	int sum = 1, res = 0; // 以u为根节点,sum保留所有子树+根节点的重量和,res保留u作为重心时的最大点数和
	for(int i=h[u]; i!=-1; i=ne[i])
	{
		int j = e[i];
		if(!st[j])
		{
			int s = dfs(j);
			sum += s;
			res = max(res, s);
		}
	}
	res = max(res, n-sum);

	ans = min(ans, res);
	return sum;
}

int main()
{
	memset(h, -1, sizeof h);
	cin >> n;
	for(int i=1; i<=n-1; i++)
	{
		int a, b;
		cin >> a >> b;
		add(a, b), add(b, a);
	}
	dfs(1);
	cout << ans;
}

8.2 dijkstra求最短路

路径

题目

image-20230404191930065

代码

// 路径
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 2100;
int g[N][N];
int st[N];
int dist[N];

int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);

    dist[1] = 0;

    for(int i=1; i<=2021; i++)
    {
        // 找到不在st数组里的最小的点
        int res = -1;
        for(int j=1; j<=2021; j++)
            if(!st[j] && (res==-1 || dist[j] < dist[res])) res = j;
        
        // 标记
        st[res] = 1;

        // 更新所有点
        for(int j=1; j<=2021; j++)
            dist[j] = min(dist[j], dist[res] + g[res][j]);
    }
    if(dist[2021] == 0x3f3f3f3f) return -1;
    else return dist[2021];
}

int main()
{
    // 请在此输入您的代码
    memset(g, 0x3f, sizeof g);
    for(int i=1; i<=2021; i++)
        for(int j=1; j<=2021; j++) if(i != j)
        {
            int a = i, b = j;
            if(abs(a-b) <= 21) g[a][b] = a*b/__gcd(a, b);
        }

    int t = dijkstra();

    cout << t;
    return 0;
}
出差

题目

image-20230405211756980

代码

// 出差
#include<iostream>
#include<cstring>
using namespace std;

const int N = 1010;
int g[N][N];
int dist[N];
bool st[N];
int wait[N];
int n, m;

int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);

    dist[1] = 0;

    for(int i=1; i<=n; i++)
    {
        int res = -1;
        for(int j=1; j<=n; j++)
            if(!st[j] && (res==-1 || dist[j] < dist[res])) 
                res = j;

        st[res] = 1;

        for(int j=1; j<=n; j++)
            dist[j] = min(dist[j], dist[res] + g[res][j]);
    }

    if(dist[n] == 0x3f3f3f3f) return -1;
    else return dist[n];
}

int main()
{
    cin >> n >> m;
    memset(g, 0x3f, sizeof g);

    for(int i=1; i<=n; i++) cin >> wait[i];
    wait[n] = 0;

    for(int i=1; i<=m; i++)
    {
        int u, v, c;
        cin >> u >> v >> c;
        if(u == v)
        {
            g[u][v] = g[v][u] = 0;
            continue;
        }
        g[u][v] = min(g[u][v], c + wait[v]);
        g[v][u] = min(g[v][u], c + wait[u]);
    }


    cout << dijkstra()  ;

}
acwing849Dijkstra求最短路Ⅰ

题目

image-20230404211915291

代码

// acwing849Dijkstra求最短路Ⅰ
#include<iostream>
#include<cstring>
using namespace std;

const int N = 5e2+10;
const int M = 1e5+10;

int g[N][N];
int dist[N];
bool st[N];
int n, m;

int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);

    dist[1] = 0;

    for(int i=1; i<=n; i++)
    {
        int res = -1;
        for(int j=1; j<=n; j++)
            if(!st[j] && (res==-1 || dist[j] < dist[res])) 
                res = j;

        st[res] = 1;

        for(int j=1; j<=n; j++)
            dist[j] = min(dist[j], dist[res] + g[res][j]);
    }

    if(dist[n] == 0x3f3f3f3f) return -1;
    else dist[n];
}

int main()
{
    memset(g, 0x3f, sizeof g);
    cin >> n >> m;
    for(int i=1; i<=m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        if(a!=b) g[a][b] = min(g[a][b], c);
    }

    int t = dijkstra();

    cout << t;
}
acwing850dijkstra求最短路Ⅱ

题目

image-20230405204425110

代码

// acwing850Dijkstra求最短路Ⅱ
#include<iostream>
#include<cstring>
#include<queue>

using namespace std;

typedef pair<int, int> PII;

const int N = 200010;

int h[N], e[N], ne[N], w[N], idx;
int dist[N];
bool st[N];
int n, m;



int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;

    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, 1});

    while(heap.size())
    {
        auto t = heap.top();
        heap.pop();

        int ver = t.second, dis = t.first;
        if(st[ver]) continue;
        st[ver] = 1;
        
        for(int i=h[ver]; i!=-1; i=ne[i])
        {
            int j = e[i];
            if(dist[j] > dis + w[i])
            {
                dist[j] = dis + w[i];
                heap.push({dist[j], j});
            }   
        }
    }

    if(dist[n] == 0x3f3f3f3f) return -1;
    else return dist[n];
}

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

int main()
{
    memset(h, -1, sizeof h);

    cin >> n >> m;
    
    for(int i=1; i<=m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c);
    }

    int t = dijkstra();

    cout << t;
}

8.4 Floyd求最短路

acwing854Floyd求最短路

题目

image-20230405211503442

代码

// acwing854Floyd求最短路
#include<iostream>
#include<cstring>
using namespace std;

const int N = 210, INF = 1e9;
int d[N][N];
int n, m, k;

void init()
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
        {
            if(i == j) d[i][j] = 0;
            else d[i][j] = INF;
        }
}

void floyd()
{
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}

int main()
{
    cin >> n >> m >> k;
    
    init();
    
    while(m--)
    {
        int x, y, z;
        cin >> x >> y >> z;
        d[x][y] = min(d[x][y], z);
    }

    floyd();

    while(k--)
    {
        int x, y;
        cin >> x >> y;
        if(d[x][y] > INF/2) cout << "impossible" << endl;
        else cout << d[x][y] << endl;
    }
}
蓝桥杯Python组知识点 用哈希表计数的时候,若当前元素不存在,则置为1;但是用defaultdict直接+1就行,不需要判断,因为创建defaultdict的时候已经规定了默认值类型。判断一个数是否为质数,可以通过暴力算法求得,而对于求(n, m)范围内,不包括m,质数的个数,可以通过埃氏筛来求取。求两个数的最大公因数可以通过math.gcd(n,m)获取,同时也可以定义辗转相除法获取。python中的堆是小顶堆,如果是二维列表,默认以每个列表的第一个元素来排序。4)heapreplace从堆中弹出最小的元素,再压入一个新元素。 阅读详情

相关推荐

蓝桥杯省赛C++A组B组题解整理(第十、九、八、七、六、五、四、三届)

【写在前面的话19.03.24】 从第八届蓝桥杯到第十届蓝桥杯,我也是参加了三届蓝桥杯的老学姐啦,更不更新第十届的题解取决于网上有没有流出题目,但是第十届之后的题解将不会再更新了。下面的这些真题大多是我在大一的时候刷的,在大二的时候整理的,在大三的时候有修正或加更。大一的时候还不太会写代码,大约是2月份开始学编程,刷真题,4月初比的赛,然后拿了省一进了国赛,最后也混了一个国三。总有小伙伴问我大概...

ryo_218的博客 3万+

蓝桥杯程序设计学习——图论:

Dijkstra:适用于权值为非负的图的单源最短路径,用斐波那契堆的复杂度 O(E+VlgV) BellmanFord:适用于权值有负值的图的单源最短路径,并且能够检测负圈,复杂度 O(VE) SPFA:适用于权值有负值,且没有负圈的图的单源最短路径,论文中的复杂度 O(kE),k 为每个节点进入 Queue 的次数,且 k 一般

m0_60440185的博客 931

【完整版】蓝桥杯竞赛python算法笔记 代码模板|吐血总结|蓝桥杯省赛国赛

蓝桥杯经典算法模板 文章目录蓝桥杯经典算法模板1 二分1.1 二分求最大满足(check红色条件)1.2 二分求最小满足(check绿色条件)2 双指针算法2.1 求最长的不包含重复数字的连续子序列3 排列组合3.1 next_permutation 重排列一个序列 生成它的上一个序列3.2 pre_permutation 重排列一个序列 生成它的上一个序列3.3 n个数字/字母的不同排列3.4 n个数字选k个数的组合3.5 n个数字中选1~n个数的不同组合3.5.1 自己写dfs的方法3.5.2 用com

Joe_Morningstar的博客 1万+

蓝桥杯学习之数据结构——图论基础知识简介

##1.图的基本概念: 图是由一系列顶点和若干连结顶点集合内两个顶点的边组成的数据结构。 数学意义上的图,指的是由一系列点与边构成的集合,这里我们只考虑有限集。通常我们用G = (V, E)表示一个图的结构,其中V表示点集, E表示边集。 在顶点集合所包含的若干个顶点之间,可能存在着某种两两关系——如果某两个点之间的确存在这样的关系的话,我们就在这两个点之间连边,这样就得到了边集的一个成员,也就是...

ly's Blog 1949

工业模型导入Unity实战:从ProE/SolidWorks到实时渲染的完整流程

在工业仿真、数字孪生和VR/AR应用开发中,将高精度工程模型导入实时渲染引擎是一个常见的技术挑战。其核心原理在于参数化工程软件与实时渲染引擎的数据结构差异:前者基于精确的B-rep边界表示和特征树,后者依赖轻量化的三角网格与材质贴图。这一转换的技术价值在于实现工程数据的可视化与交互化,为产品展示、虚拟培训和工厂仿真等应用场景提供基础。通过数据翻译与优化流程,特别是利用3ds Max或Blender作为中转站进行网格优化与UV展开,能够有效解决模型破面、材质丢失和性能问题。本文聚焦于ProE(Creo)和So

weixin_33050117的博客 344

非sudo用户如何安全使用Docker:Rootless模式实战指南

Docker Rootless模式是一种基于Linux用户命名空间(userns)的容器运行时安全机制,它通过UID/GID映射、fuse-overlayfs文件系统和slirp4netns网络栈,在不提升权限的前提下实现容器隔离。其核心原理是将容器内root身份映射为宿主机非特权用户,从而规避docker组等价root的安全风险。相比传统root模式,Rootless在权限控制、逃逸防护和多租户隔离方面具备天然优势,适用于CI/CD流水线、Kubernetes边缘节点及受限生产环境。本文聚焦无sudo权限

weixin_30274627的博客 348

蓝桥杯必备知识点

蓝桥杯省赛知识点 1、C++ STL 常见算法 2、C++ 输入输出(包括流、文件) 3、C++常用泛型:list vector stack map 4、暴力穷举 5、递归 6、全排列 next_permutation 康托展开式 7、回溯 8、DFS、BFS、hash表 9、数学上的有:辗转相除(两行内),素数等 国赛知识点 1、hash表 2、大数(高精度)加减乘除 3、线段树 4、并查集 5、图论相关算法:最短路(Floyd、Dijstra,BellmanFord)、最小生成树(prim,krusca

qq_52769953的博客 5104

STM32 FDCAN热插拔恢复机制与自动重发功能优化

本文深入分析了STM32 FDCAN在热插拔场景下触发bus-off状态导致通讯中断的根本原因,指出自动重发功能是问题关键。通过禁用自动重发、配置硬件自动恢复机制及优化总线参数,实现了FDCAN热插拔后的100%稳定恢复,为工业应用提供了可靠的CAN总线解决方案。

ice55的博客 685

蓝桥杯知识点(大纲)

蓝桥杯知识点(大纲) 宽度搜索 快速幂 求素数因子 最大公因数 最小公倍数 并查集 状态压缩DP 基础算法 一星:打表 枚举 倍增 离散化 差分 二星:分治法 贪心(Huffman编码) 尺取法 二分法 三分法 整体二分 ST算法 搜索 一星:基本DFS 基本BFS 二星:DFS记忆化搜索 IDA* BFS扩展(双向广搜 优先队列 双端队列)剪枝 爬山算法 随机增量法 模拟退火 三星:A* 高级数据结构 一星:并查集(带权) 分块 二星:莫队算法(树上莫队) 树状数组 线段树 可持久化线段树 二叉搜索树 t

Sunny_Deer的博客 1万+

学Simulink——基于Simulink的AUTOSAR架构下电机控制软件组件建模

本文详细介绍了在Simulink中基于AUTOSAR架构开发电机控制软件组件(SWC)的全流程。主要内容包括:首先阐述了AUTOSAR架构对汽车电子系统开发的价值,包括提高软件复用率、降低集成成本和改善验证环境。然后重点讲解了在Simulink中构建电机控制SWC的具体步骤:从创建AUTOSAR组件模型、定义数据端口和服务端口,到搭建FOC控制算法、配置运行实体,最后生成AUTOSAR描述文件和验证RTE接口。文章还提供了与基础软件(BSW)的集成方案、工程实践要点和常见问题解决方案,并以大众MEB平台等实

amy_mhd的博客 67

1、动作捕捉技术:概述与历史

本博文全面介绍了动作捕捉技术的概念、历史演变、类型分类以及完整的工作流程。从早期的连续摄影技术到现代数字动作捕捉系统,文章深入探讨了光学、磁性和机械动作捕捉系统的优缺点及适用场景,并详细解析了动作捕捉数据的生成原理与数学基础。此外,还涵盖了特殊部位如手部、面部和木偶的动作捕捉方法,并讨论了动作捕捉在动画制作、虚拟现实、医疗康复等领域的广泛应用与发展前景。

apple5的专栏 219

2021蓝桥杯Java复习【史上最详细攻略】【持续更新】

Java排序 交叉排序 import java.math.BigInteger; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); Integer a[]; Integer n = cin

weixin_43960370的博客 2万+

认知建模:模拟人类决策过程的AI方法

认知建模的目的在于构建能够模拟人类认知和决策过程的模型,通过AI技术将人类的思维、判断和选择等过程以数字化的形式呈现出来。其范围涵盖了多个领域,包括心理学、人工智能、经济学、管理学等。在心理学领域,认知建模可以帮助研究人员更好地理解人类的认知机制;在人工智能领域,可用于开发具有更智能决策能力的系统;在经济学和管理学中,能辅助进行市场预测、战略规划等决策制定。本文首先介绍认知建模的背景知识,让读者对该领域有初步的了解。接着阐述核心概念和它们之间的联系,通过示意图和流程图直观展示。

AI 算法实战派 1165

蓝桥杯学习大纲

致酷德与热爱算法、编程的小伙伴们

2302_80067378的博客 9344

【Bug已解决】Request timed out / API Timeout — Claude Code 请求超时解决方案

方案适用场景推荐指数难度方案一:增加超时大任务处理⭐⭐⭐⭐⭐低方案二:切换 SonnetOpus 太慢⭐⭐⭐⭐⭐低方案三:缩小范围大代码库⭐⭐⭐⭐⭐低方案四:优化网络网络延迟高⭐⭐⭐⭐中方案五:减少 MCPMCP 超时⭐⭐⭐中方案六:流式响应长生成任务⭐⭐⭐低根本原因:请求超时最常见原因是请求体过大(35%)和 Opus 模型推理慢(25%),默认 60 秒超时阈值对大型任务不够最佳实践。

一键难忘的博客 5158

boost::circular_buffer缓行缓冲区

1、circular_buffer实现了一个环形缓冲区,空间大小是固定的,当到达容器末尾时,将自动利用容器另一端的位置空间。 2、当程序需要容纳大量的元素,但多数情况下仅保存较少数量元素时可以使用circular_buffer_space_optimized,他可以有效的减少内存的占用,提高程序的运行效率。 3、主要接口: 4、实现一个生产者---消费者模式示例: #inc...

小米的修行之路 790

蓝桥杯C语言组:图论问题

图论是计算机科学中的一个重要分支,在蓝桥杯C语言组竞赛中,图论问题频繁出现,对参赛选手的算法设计和编程能力提出了较高要求。本文系统地介绍了图论的基本概念、常见算法及其在蓝桥杯C语言组中的应用,通过具体实例和表格,详细解释了图论问题的解题思路和实现方法,旨在为参赛选手提供参考和指导。

weixin_74149145的博客 1738

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

2025蓝桥杯Java组备赛知识点全面汇总

本文系统整理了蓝桥杯Java组竞赛所需的核心知识点,涵盖从基础语法到高级算法的各个方面,旨在帮助参赛选手高效备赛。内容基于优快云等多篇高质量技术博客的精华内容整合而成,包括输入输出处理、数据结构应用、算法模板、数学知识等关键领域。每个知识点都配有典型例题和代码实现,特别适合备赛蓝桥杯省赛及国赛的Java选手参考学习。Java中的标准输入输出是蓝桥杯竞赛中最基础也是最重要的部分。Scanner类是处理输入最常用的工具: 注意事项:当输入输出规模超过1e6时,必须使用快速IO: 性能对比: 字符串操作 基本字

Magnolia_He的博客 3690

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

蓝桥杯JAVA-知识点汇总复习

为准备第十三届蓝桥杯大赛(软件类)省赛。 个人博客 www.tothefor.com 知识点 蓝桥杯JAVA-1.入门必知、正常输入输出和快速输入输出 蓝桥杯JAVA-2.数组操作 蓝桥杯JAVA-3.自定义类排序、进制转换、保留小数位数 蓝桥杯JAVA-4.常用数据类型 蓝桥杯JAVA-5.位运算技巧和原理 蓝桥杯JAVA-6.大数(整数、小数)处理 蓝桥杯JAVA-7.集合(容器)在竞赛中的使用 ...

墨水记忆 6万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

蓝桥杯大赛考点汇总

蓝桥杯重点(C/C++)

m0_71934846的博客 6万+

【备战蓝桥杯系列】蓝桥杯国二选手笔记一:蓝桥杯中的Java常用语法特性

参加了好几次蓝桥杯了,C++组参加了,Java也参加过,下面给出常用的Java语法特性在蓝桥杯中的使用,以及常见的需要注意的Java语法规范。**有需要准备的朋友可以关注一下,不定期更新蓝桥杯的笔记以及经验分享。**

weiambt的博客 3285

最全蓝桥杯省赛国赛知识点总结

最全蓝桥杯省赛国赛知识点总结及其模板

qq_42798343的博客 3414

【备战蓝桥杯系列】蓝桥杯国二选手笔记二:算法模版笔记(Java)

准备蓝桥杯的同学可以关注一下本专栏哦,不定期更新蓝桥杯笔记以及经验分享。本人多次参加过蓝桥杯,并获得过蓝桥杯国二的成绩。

weiambt的博客 2089

蓝桥杯竞赛向(C/C++语言)之DP和图论篇

比如说我有12个价值为1,体积为1的物品,二进制就转化为1个价值1,体积1,1个价值1 * 2,体积1 * 2,1个价值1 * 4,体积1 * 4,发现12 - 1 - 2 - 4 = 5 < 8,最后·就剩了一个价值5,体积5的物品,这样就直接转化为了01背包,非常牛。第三步:初始化,一些已经知道的量 / 题里已经给出的量/需要用它推导下一个状态的量,dp[1] = dp[2] = 1;背包问题是经典的DP问题,主要以01背包,完全背包,多重背包为主。状压DP也很重要,但是本人掌握的并不好就没来讲。

weixin_62188419的博客 1082

蓝桥杯备赛笔记(一)

持续更新,量变产生质变。

qq_45310624的博客 4288

【备战蓝桥杯】快来学吧~ 图论巩固,Delia的生物考试

【图论巩固】你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条。于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧~

Kirara的博客 1267
上一篇: (实时更新)蓝桥杯知识点笔记 | (六)动态规划之背包问题
下一篇: 一文解决,WPS编辑word文档时,批注的解决按钮灰色无法点击
introversi0n
博客等级 码龄5年 233粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

introversi0n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值