图论基础(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.rhkb.cn/news/296705.html

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

相关文章

【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

SQL server 查询数据库中所有的表名及行数

SQL server 查询数据库中所有的表名及行数 select a.name,b.rows from sysobjects as ainner join sysindexes as bon a.id b.id where (a.type u)and (b.indid in (0, 1)) and b.rows<50 and b.rows>20 order by a.name, b.rows desc;

图像处理_积分图

目录 1. 积分图算法介绍 2. 基本原理 2.1 构建积分图 2.2 使用积分图 3. 举个例子 1. 积分图算法介绍 积分图算法是图像处理中的经典算法之一&#xff0c;由Crow在1984年首次提出&#xff0c;它是为了在多尺度透视投影中提高渲染速度。 积分图算法是一种快速计算图像区域和…

Ceph分布式存储系统以及高可用原理

Ceph分布式存储系统以及高可用原理 1. Ceph原理和架构1.1 分布式存储系统抽象1.2 Ceph基本组件 2 Ceph中的策略层2.1 CRUSH进行数据分发和定位2.2 PG(Placement Group): 集群管理的基本单元2.3 PG的代理primary OSD2.4 轻量级的集群元数据ClusterMap2.5 对PG的罗辑分组&#xf…

观察和配置MAC地址表

目录 原理概述 实验目的 实验内容 实验拓扑 ​编辑1&#xff0e;基本配置 2.观察正常状态时的MAC地址表 4.配置静态MAC地址表项 原理概述 MAC 地址表是交换机的一个核心组成部分&#xff0c;交换机主要是根据 MAC 地址表来进行帧的转发的。交换机对帧的转发操作行为一共有…

车道线检测_Canny算子边缘检测_1

Canny算子边缘检测&#xff08;原理&#xff09; Canny算子边缘检测是一种经典的图像处理算法&#xff0c;由John F. Canny于1986年提出&#xff0c;用于精确、可靠地检测数字图像中的边缘特征。该算法设计时考虑了三个关键目标&#xff1a;低错误率&#xff08;即尽可能多地检…

【漏洞复现】WordPress Plugin LearnDash LMS 敏感信息暴漏

漏洞描述 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 WordPress Plugin LearnDash LMS 4.10.2及之前版本存在安全漏洞&#x…

从汇编看函数调用

文章目录 函数调用流程栈相关寄存器及的作用简介寄存器功能指令功能 栈函数的括号{}正括号反括号 参数传递传值&#xff0c;变量不可改传指针&#xff0c;变量可改C 传引用 函数调用实例 函数调用流程 目标&#xff1a;函数调用前后栈保持不变 保存main函数的寄存器上下文移…

使用MySQL和PHP创建一个公告板

目录 一、创建表 二、制作首页&#xff08;创建主题以及显示列表&#xff09; 三、制作各个主题的页面&#xff08;输入回帖和显示列表&#xff09; 四、制作消息的查询界面 五、制作读取数据库信息的原始文件 六、制作数据重置页面 七、效果图 八、问题 1、目前无法处…

商务电子邮件: 在WorkPlace中高效且安全

高效和安全的沟通是任何组织成功的核心。在我们关于电子邮件类型的系列文章的第二期中&#xff0c;我们将重点关注商业电子邮件在促进无缝交互中的关键作用。当你身处重要的工作场环境时&#xff0c;本系列的每篇文章都提供了电子邮件的不同维度的视角。 “2024年&#xff0c;全…

基于springboot实现房屋租赁管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现房屋租赁系统演示 摘要 房屋是人类生活栖息的重要场所&#xff0c;随着城市中的流动人口的增多&#xff0c;人们对房屋租赁需求越来越高&#xff0c;为满足用户查询房屋、预约看房、房屋租赁的需求&#xff0c;特开发了本基于Spring Boot的房屋租赁系统。 …

保健品wordpress外贸模板

保健品wordpress外贸模板 健康保养保健品wordpress外贸模板&#xff0c;做大健康行业的企业官方网站模板。 https://www.jianzhanpress.com/?p3514

防火墙状态检测和会话机制

FW对TCP&#xff0c;UDP和ICMP协议的报文创建会话

【如何解决一些常见的 Composer 错误的保姆级讲解】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

如何使用免费的ChatGpt3.5

如何使用免费的ChatGpt 最近免费的gpt3.5很多都不怎么行了实在是太给力了尾声 最近免费的gpt3.5很多都不怎么行了 原因是什么呢&#xff1f;因为openai已经取消了免费的5刀赠送&#xff0c;那么这些人手上的免费的sses-key 用完后&#xff0c;就基本上全军覆没了&#xff0c;再…

在 Amazon Timestream 上通过时序数据机器学习进行预测分析

由于不断变化的需求和现代化基础设施的动态性质&#xff0c;为大型应用程序规划容量可能会非常困难。例如&#xff0c;传统的反应式方法依赖于某些 DevOps 指标&#xff08;如 CPU 和内存&#xff09;的静态阈值&#xff0c;而这些指标在这样的环境中并不足以解决问题。在这篇文…

vscode + wsl1 搭建远程C/C++开发环境

记录第一次搭建环境过程。 搭建C/C开发环境有很多种方式&#xff0c;如 MinGW vscode&#xff08;MinGW 是GCC的Windows版本&#xff0c;本地编译环境&#xff09;SSH隧道连接 vscode&#xff08;远程Linux主机&#xff09;wsl vscode&#xff08;远程Linux环境&#xff09…

flink1.18源码本地调试环境

01 源码本地调试环境搭建 1. 从github拉取源码创建本地项⽬ https://github.com/apache/flink.git 可以拉取github上官⽅代码 https://github.com/apache/flink.git GitHub - apache/flink: Apache Flink 2. 配置编译环境 ctrlaltshifts &#xff08;或菜单&#xff09;打…

node.js的错误处理

当我打开一个不存在的文件时&#xff0c;错误如下&#xff1a; 在读取文件里面写入console.log&#xff08;err&#xff09;&#xff0c;在控制台中可以看到我的错误代码类型&#xff1a;文件不存在的错误代码 ENOENT。见更多错误代码---打开node.js官方API文档Error 错误 | N…

Redhat 7.9 安装dm8配置文档

Redhat 7.9 安装dm8配置文档 一 创建用户 groupadd -g 12349 dinstall useradd -u 12345 -g dinstall -m -d /home/dmdba -s /bin/bash dmdba passwd dmdba二 创建目录 mkdir /dm8 chown -R dmdba:dinstall /dm8三 配置/etc/security/limits.conf dmdba soft nproc 163…