图论基础(python蓝桥杯)

图的基本概念

图的种类

怎么存放图呢?

优化

DFS

不是最快/最好的路,但是能找到一条连通的道路。(判断两点之间是不是连通的)

蓝桥3891

import os
import sys
sys.setrecursionlimit(100000)
# 请在此输入您的代码
n, m = map(int, input().split()) # n个点, 小明序号m
G = [[] for _ in range(n + 1)] # 邻接表,存放图。
rudu = [0] * (n + 1) # 记录每个点的入度
vis = [0] * (n + 1) # dfs的标记数组,看是否遍历过
# 二元组,分别表示每个子树数量和编号
dis = [[0, i] for i in range(n + 1)] # 排序用的二元组
for _ in range(n - 1):l, r = map(int, input().split())G[r].append(l) # r是l的父亲rudu[l] += 1
for i in range(1, n + 1):if rudu[i] == 0:root = i # 入度为0的是根节点,找到根节点,从根节点开始遍历。def dfs(u):# 同时记录每个点的子树节点数dis[u][0] = -1 # 1改成-1,以便都从小到大排序vis[u] = 1for v in G[u]:if vis[v] == 0:dfs(v)dis[u][0] += dis[v][0]dfs(root)
dis.sort()
# print(dis)
for i, (x, y) in enumerate(dis, 1): # 取出dis的排名,1的意思是索引从1开始if y == m:print(i)break

BFS

按层次分节点(几步能走的点)

不断这样取,直到终点。

蓝桥1509

import os
import sys# 请在此输入您的代码
from collections import deque
def bfs(s, t):# s起点, t终点。dis = [-1] * 100001queue = deque()# 将起点塞入队列中,打上标记。queue.append(s)dis[s] = 0# 当队列非空while len(queue) != 0:# 取出队首元素uu = queue.popleft()# 判断u是否为终点if u == t:return dis[u]# 将u相连的所有点v,只要v未标记,则打标记,入队列for v in [u - 1, u + 1, u * 2]:# 特判:越界、已标记、障碍物if 0 <= v <= 100000 and dis[v] == -1:queue.append(v)dis[v] = dis[u] + 1return -1
n, k = map(int, input().split())
print(bfs(n, k))

蓝桥3819

import os
import sys# 请在此输入您的代码
from collections import dequedef bfs(x, y, dis):queue = deque()vis = [[0] * m for i in range(n)]# 将起点入队列queue.append([x, y])dis[x][y] = 0vis[x][y] = 1while len(queue) != 0:x, y = queue.popleft()# 要求所有点,这步省略for deltax, deltay in [(1, 0), (0, 1), (-1, 0), (0, -1)]:xx, yy = x + deltax, y + deltay# 未越界,未标记,未障碍物if 0 <= xx < n and 0 < yy < m and vis[xx][yy] == 0 and g[xx][yy] != '#':queue.append([xx, yy])dis[xx][yy] = dis[x][y] + 1vis[xx][yy] = 1n, m = map(int, input().split())
INF = 1e9 # 把路堵死了,永远走不到终点。
A, B, C, D = map(int, input().split())
A, B, C, D = A - 1, B - 1, C - 1, D - 1
g = [input() for i in range(n)]
E = int(input())
dis1 = [[INF] * m for i in range(n)]
dis2 = [[INF] * m for i in range(n)]
bfs(A, B, dis1)
bfs(C, D, dis2)
res = dis1[C][D]
if res <= E:print(res)
else:# 枚举所有圣泉res = INFfor i in range(n):for j in range(m):if g[i][j] == 'V':res = min(res, dis1[i][j] + dis2[i][j])if res == INF:print("No")else:# 初始能量为E,总距离res, 后面的res-E需要花费两倍时间,因为需要等待能量恢复print((res - E) * 2 + E)

拓扑排序

拓扑排序是一种针对“有向无环图”的算法,用于解决一些有依赖关系的问题。

拓扑排序保证了处理到某个点时,其所有的入点已经处理过了。

例如下面这个图,拓扑排序可以保证:

处理点2之前,点4和点6都处理过。

处理点3之前,点2和点6都处理过。

比如学大学物理必须先学高数和线性代数。

拓扑排序的顺序并不是唯一的,就刚刚的例子,你可以先学高数再学线代,也可以先学线代再学高数。

下图是拓扑排序的几种可能性

如果有环的话找不到起点,自己想想应该就能想出来。

BFS实现拓扑排序

  1. 先预处理每个点的入度,这个在读入边的时候处理。
  2. 每次将入度为0的点入队列。
  3. 每次取点u的时候,对于从u出发的所有点v的入度-1

1此时的入度为0,相当于做了一个操作,把1->4和1->6的边给删掉了,然后发现4和6的入度又为0了。

  • 在枚举边u->v的时候,可以进行状态转移,于是可以和动态规划结合起来。
  • 这样的dp也叫DAG-DP(有向无环图上的动态规划)
  • 状态转移一般只发生在枚举所有边的时候。
模板
from collections import dequedef topo():q = deque()for i in range(1, n + 1):if ru[i] == 0:q.append(i)ans = []while len(q) != 0:u = q.popleft()ans.append(u)for v in G[u]:ru[v] -= 1if ru[v] == 0:q.append(v)if len(ans) != n:print("no topo")else:print(*ans, sep=' ')
n, m = map(int, input().split())  
G = [[] for i in range(n + 1)]
ru = [0] * (n + 1)
for _ in range(m):u, v = map(int, input().split())G[u].append(v)
topo()

蓝桥1337

import os
import sys# 请在此输入您的代码
from collections import dequedef topo():q = deque()for i in range(1, n + 1):if ru[i] == 0:q.append(i)while len(q) != 0:# 取出队首元素u = q.popleft()# 对于和u相邻的每个点vfor v in G[u]:# 从u走到v,说明dp[v]可以从dp[u] + 1转移过来dp[v] = max(dp[v], dp[u] + 1)ru[v] -= 1if ru[v] == 0:q.append(v)# dp[i] 表示走到i的最长路,也就是最大值。      
n, m = map(int, input().split())
dp = [0] * (n + 1)  
G = [[] for i in range(n + 1)]
ru = [0] * (n + 1)
for _ in range(m):u, v = map(int, input().split())G[u].append(v)
topo()
print(max(dp))

蓝桥3351

import os
import sys
from queue import PriorityQueue
# 请在此输入您的代码def topo():q = PriorityQueue()for i in range(1, n + 1):if ru[i] == 0:q.put(i)ans = []while not q.empty():u = q.get()ans.append(u)for v in G[u]:ru[v] -= 1if ru[v] == 0:q.put(v)if len(ans) != n:print(-1)else:print(*ans, sep=' ')
n, m = map(int, input().split())
G = [[] for i in range(n + 1)]
ru = [0] * (n + 1)
for _ in range(m):u, v = map(int, input().split())G[u].append(v)ru[v] += 1
topo()

Floyd

用于求解多源最短路,可以求解出任意两点的最短路

定义dp[k][i][j]为点i到点j路径(除去起点终点)中最大编号不超过k的情况下,点i到点j的最短距离。

当加入第k个点作为i到j的中间点时

dp[k][i][j]= min(dp[k - 1][i][j],dp[k - 1][i][k]+ dp[k - 1][k][j])

利用滚动数组优化第一维度

dp[i][j]= min(dp[i][j],dp[i][k]+ dp[k][j])

枚举所有k ,判断是否可以作为中间点,可以作为中间点则优化最短路初始化:如果<i,j>无边,则dp[i][j] = INF,右边则等于边权;
dp[i][i]= 0

蓝桥1121

import os
import sys# 请在此输入您的代码
n, m, q = map(int, input().split())
INF = 1e18 
dp = [[INF] * (n + 1) for i in range(n + 1)]
for i in range(1, n + 1):dp[i][i] = 0
for _ in range(m):u, v, w = map(int, input().split())dp[u][v] = dp[v][u] = min(dp[u][v], w)for k in range(1, n + 1):for i in range(1, n + 1):for j in range(1, n + 1):dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])
for _ in range(q):u, v = map(int, input().split())if dp[u][v] == INF:print(-1)else:print(dp[u][v])

蓝桥8336

import os
import sys# 请在此输入您的代码
n, m = map(int, input().split())
a, p, s = [0] * (n + 1), [0] * (n + 1), [0] * (n + 1)
INF = 1e9
f = [[INF] * (n + 1) for i in range(n + 1)]
g = [[0] *(n + 1) for i in range(n + 1)]for i in range(1, n + 1):a[i], p[i], s[i] = map(int, input().split())
for i in range(1, m + 1):u, v, w = map(int, input().split())f[u][v] = f[v][u] = min(f[u][v], w)
for i in range(1, n + 1):f[i][i] = 0
for k in range(1, n + 1):for i in range(1, n + 1):for j in range(1, n + 1):f[i][j] = min(f[i][j], f[i][k] + f[k][j])
for i in range(1, n + 1):for j in range(1, n + 1):g[i][j] = s[j] - p[i] - f[i][j]
ans = 0
for i in range(1, n + 1):now_ans = 0for j in range(1, n + 1):now_ans = max(now_ans, a[i] * g[i][j])ans += now_ans
print(ans)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是工业协议转换软件?

在现代工业自动化领域&#xff0c;随着技术的不断革新和智能化水平的提升&#xff0c;各种工业设备和系统之间的通信变得日益重要。然而&#xff0c;由于历史、技术差异和标准多样化等原因&#xff0c;不同的工业设备和系统往往采用各自独特的通信协议&#xff0c;导致它们之间…

Android Studio 打开Local Changes界面

在编写代码的过程中&#xff0c;经常要回顾本地仓库做了那些修改。打开Local Changes界面&#xff0c;能做到一目了然&#xff0c;不用再去使用git命令查看。 File->Settings->Version control->Commit 把Use non-modal commit interface 选项 取消勾选 即可

如何使用VNC+Cpolar实现Windows电脑公网远程控制Ubuntu系统桌面

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

官宣!一文掌握2024百度CreateAI开发者大会最新议程

4月16日上午9:00&#xff0c;以“创造未来”为主题的2024百度Create AI开发者大会将在深圳国际会展中心&#xff08;宝安&#xff09;开幕。此次大会将是近十年来&#xff0c;粤港澳大湾区规格最高的AI大会&#xff0c;将聚焦炙手可热的AI话题&#xff0c;在大会主论坛、分论坛…

卡尔曼滤波笔记

资料&#xff1a;https://www.zhihu.com/question/47559783/answer/2988744371 https://www.zhihu.com/question/47559783 https://blog.csdn.net/seek97/article/details/120012667 一、基本思想 在对一个状态值进行估计的时候&#xff0c;如果想测量值更准&#xff0c;很自然…

Windows搭建Lychee图片管理系统结合内网穿透实现公网访问本地图床

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

【机器学习】科学库使用第3篇:机器学习概述,学习目标【附代码文档】

机器学习&#xff08;科学计算库&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习&#xff08;常用科学计算库的使用&#xff09;基础定位、目标&#xff0c;机器学习概述定位,目标,学习目标,学习目标,1 人工智能应用场景,2 人工智能小…

计算机网络|谢希仁版|数据链路层

数据链路层 数据链路层研究的是什么&#xff1f;数据链路层的几个共同问题数据链路与链路帧通信规程 三个基本问题封装成帧透明传输差错检测可靠传输 点对点协议PPPPPP协议应满足的需求PPP协议的组成PPP协议帧的格式各字段的意义字节填充零比特填充PPP协议的工作状态 使用广播信…

三电源切换电路。

一个三电源切换电路 电路描述 1、Q1、Q2为NMOS&#xff0c;Q3、Q4和Q5为PMOS管&#xff0c;D1为二极管。 2、BAT1和BAT2为电池&#xff0c;BAT2的容量比BAT1大&#xff0c;VIN_5V为外部电源&#xff0c;VOUT为输出&#xff0c;给系统供电。 3、VOUT会从优先级高的电源取电&a…

黑盒测试—等价分类法

等价分类法是把程序的输入域划分成若干部分&#xff08;子集&#xff09;&#xff0c;然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值。测试时把有效类与无效类相互组合&#xff0c;得到测试结果。 例题如下&#x…

【面试HOT200】数组篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试coding部分的&#xff0c;整理期间苛求每个算法题目&#xff0c;平衡可读性与代码性能&#xff08;leetcode运行复杂度均打败80%以上&#xff09;。 &#x1f970;来源&#xff1a;材料主要源于…

视觉检测系统,外观细节无可挑剔

在传统行业中&#xff0c;利用人工检测来检测产品外观缺陷依然是主流&#xff0c;但由于竞争的加剧&#xff0c;对企业生产效率的要求也越来越高。传统的检测产品外观缺陷问题的方法就是透过人工目检&#xff0c;或者工人采用游标卡尺等工具检测&#xff0c;此种方式检测速度慢…

振弦式应变计:简单操作,方便实用的应变监测工具

在现代工程领域中&#xff0c;对于结构物的应变监测是一项至关重要的任务。振弦式应变计作为一种高精度、高稳定性的应变监测工具&#xff0c;因其简单操作、方便实用的特点&#xff0c;受到了广大工程师和技术人员的青睐。 振弦式应变计的工作原理基于振弦的振动特性。它通过将…

HCIA笔记

console 登录设备的特点&#xff1a; 1、带外&#xff0c;不依赖网络本身的连通性。 2、独占&#xff0c;console口不能被多人同时使用&#xff0c;具备唯一性。 3、本地&#xff0c;console口长度有限&#xff0c;一般只能在机房或者设备现场来使用。 4、只能实现命令行的管理…

ngAlain下使用nz-select与文件上传框出现灵异bug

bug描述 初始化页面&#xff0c;文件上传框无法出现&#xff1a; 但点击一次选择框以后&#xff0c;就会出现&#xff1a; 真的很神奇。。。 下面逐步排查看看是什么原因。 设想一&#xff1a; 选择框与文件框不可同时存在&#xff0c;删掉选择框看看&#xff1a; 还…

隐语SecretFlow实训营-第8讲:快速上手隐语SCQL的开发实践

SCQL使用/集成实践 目前SCQL只开放API供用户使用/集成 使用SCDBClient上手体验可以基于SCQL API开发封装白屏产品&#xff0c;或集成到业务链路中 使用流程&#xff1a; 部署系统 环境配置&#xff1a; 机器配置&#xff1a;CPU/MEM最低8C16G机构之间的网络互通 镜像&…

全面了解海外网络专线

SD-WAN海外网络专线技术 在选择海外网络专线服务时&#xff0c;企业需要考虑多个因素&#xff0c;包括服务商的可靠性、价格、技术支持和合规性。本文将探讨跨境网络专线的价格因素、合法跨境上网的方式&#xff0c;以及SD-WAN跨境上网专线的优势。 跨境网络专线的价格与办理…

STM32学习笔记(11_2)- W25Q64简介和工作原理

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期学…

Golang Gin框架

1、这篇文章我们简要讨论一些Gin框架 主要是给大家一个基本概念 1、Gin主要是分为路由和中间件部分。 Gin底层使用的是net/http的逻辑&#xff0c;net/http主要是说&#xff0c;当来一个网络请求时&#xff0c;go func开启另一个协程去处理后续(类似epoll)。 然后主协程持续…

蓝桥杯物联网竞赛_STM32L071_15_ADC/脉冲模块

ADC模块用的是RP1不用多说了&#xff0c;主要是脉冲模块&#xff0c;这个模块没考过 这个脉冲模块放出脉冲&#xff0c;主要能用TIM捕获到这个脉冲的高电平持续时间即可 CubMx配置&#xff1a; 脉冲模块的引脚与PB0相连&#xff0c;所以用PB0读取上升沿记的数和下降沿记的数&am…