图论基础(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] = 1
  for 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] * 100001
  queue = deque()
  # 将起点塞入队列中,打上标记。
  queue.append(s)
  dis[s] = 0
  # 当队列非空
  while len(queue) != 0:
    # 取出队首元素u
    u = 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] + 1
  return -1
n, k = map(int, input().split())
print(bfs(n, k))

蓝桥3819

import os
import sys

# 请在此输入您的代码
from collections import deque

def bfs(x, y, dis):
  queue = deque()
  vis = [[0] * m for i in range(n)]
  # 将起点入队列
  queue.append([x, y])
  dis[x][y] = 0
  vis[x][y] = 1
  while 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] + 1
          vis[xx][yy] = 1

n, 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 = INF
  for 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 deque

def 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] -= 1
            if 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 deque

def 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相邻的每个点v
    for v in G[u]:
      # 从u走到v,说明dp[v]可以从dp[u] + 1转移过来
      dp[v] = max(dp[v], dp[u] + 1)
      ru[v] -= 1
      if 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] -= 1
            if 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 = 0
  for j in range(1, n + 1):
    now_ans = max(now_ans, a[i] * g[i][j])
  ans += now_ans
print(ans)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++----list模拟实现

目录 1. list的基本介绍 2. list的基本使用 2.1 list的构造 用法示例 2.2 list迭代器 用法示例 2.3. list容量&#xff08;capacity&#xff09;与访问&#xff08;access) 用法示例 2.4 list modifiers 用法示例 2.5 list的迭代器失效 3.list的模拟实现 3.1…

sqli第24关二次注入

注入点 # Validating the user input........$username $_SESSION["username"];$curr_pass mysql_real_escape_string($_POST[current_password]);$pass mysql_real_escape_string($_POST[password]);$re_pass mysql_real_escape_string($_POST[re_password]);if($p…

高档次定制线缆工厂-精工电联:智能化生产如何提升线缆品质

在百年未有之大变局的当下&#xff0c;科技发展日新月异的今天&#xff0c;智能化生产已经成为各行各业追求高效、高品质的重要手段。作为线缆行业的领先者&#xff0c;精工电联始终站在行业前沿&#xff0c;致力于通过智能化生产提升线缆品质&#xff0c;为客户创造更多、更有…

SpringMVC常见面试题

1&#xff1a;Spring mvc执行流程 回答&#xff1a; 版本1&#xff1a;视图版本&#xff0c;jsp 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping(处理映射器)HandlerMapping找到具体的处理器&#xff0c;生成处理器对象及处理器拦…

ctfshow web入门 XXE

XXE基础知识 XXE&#xff08;XML External Entity&#xff09;攻击是一种针对XML处理漏洞的网络安全攻击手段。攻击者利用应用程序在解析XML输入时的漏洞&#xff0c;构造恶意的XML数据&#xff0c;进而实现各种恶意目的。 所以要学习xxe就需要了解xml xml相关&#xff1a; …

【应用层协议原理】

文章目录 第二章 应用层2.1 应用层协议原理2.1.1 网络应用的体系结构2.1.2 客户-服务器&#xff08;C/S&#xff09;体系结构2.1.3 对等体&#xff08;P2P&#xff09;体系结构2.2.4 C/S和P2P体系结构的混合体2.2.5 进程通信问题1&#xff1a;对进程进行编址&#xff08;addres…

YOLOv5改进系列:升级版ResNet的新主干网络DenseNet

一、论文理论 论文地址&#xff1a;Densely Connected Convolutional Networks 1.理论思想 DenseNet最大化前后层信息交流&#xff0c;通过建立前面所有层与后面层的密集连接&#xff0c;实现了特征在通道维度上的复用&#xff0c;不但减缓了梯度消失的现象&#xff0c;也使其…

蓝桥杯刷题day12——元素交换【算法赛】

一、题目描述 给定个大小为2N的二进制数组A&#xff0c;其中包含N个0和N个1。 现在&#xff0c;你可以交换数组中的任意两个元素。请你计算&#xff0c;至少需要多少次交换操作&#xff0c;才能保证数组中不存在连续的0或1. 输入格式 第行包含一个整数N(1<N≤10^5),表示数…

【微服务】OpenFeign+Sentinel集中处理远程调用异常

文章目录 1.微服务基本环境调整1.对10004模块的application.yml调整2.启动nacos以及一个消费者两个提供者3.测试1.输入http://localhost:8848/nacos/index.html 来查看注册情况2.浏览器访问 http://localhost:81/member/nacos/consumer/get/13.结果 2.使用OpenFeign实现微服务模…

【echart】数据可视化

什么是数据可视化&#xff1f; 数据可视化主要目的:借助于图形化手段&#xff0c;清晰有效地传达与沟通信息。 数据可视化可以把数据从冰冷的数字转换成图形&#xff0c;揭示蕴含在数据中的规律和道理。 如何绘制&#xff1f; echarts 图表的绘制&#xff0c;大体分为三步:…

使用1panel部署Ollama WebUI(dcoekr版)浅谈

文章目录 说明配置镜像加速Ollama WebUI容器部署Ollama WebUI使用问题解决&#xff1a;访问页面空白 说明 1Panel简化了docker的部署&#xff0c;提供了可视化的操作&#xff0c;但是我在尝试创建Ollama WebUI容器时&#xff0c;遇到了从github拉取镜像网速很慢的问题&#xf…

pytest--python的一种测试框架--pytest初阶

前言 使用pytest去做测试时我们对文件名的命名其实是有规范的&#xff0c;要用test_开头&#xff01;&#xff01;&#xff01; 一、pytest初阶 def test_one():expect1actual1assert expectactual#测试专用语句&#xff1a;assert&#xff0c;识别期望与实际值是否相等这个…

后疫情时代CS保研沉思录暨2023年个人保研经验贴

个人情况 正如古话所说&#xff0c;最适合你的才是最好的。因此这里先贴上个人基本情况&#xff0c;用作参考。 如果你的个人情况与我相近&#xff0c;则有更强的参考作用。如果情况相差较大&#xff0c;也可以姑且引为例子来研究。 学校层次&#xff1a;中流至末流211 专业…

Linux 学习之路 -- 工具篇 -- gcc / g++

在 Linux 系统中&#xff0c;gcc 和 g 是两个常用的编译工具&#xff0c;分别用于编译 C 和 C 代码。下面我将介绍gcc、g的一些基本用法 目录 一、简单的认识 二、简单了解一下编译的过程 <1> 预处理阶段 <2>编译 <3>汇编 <4>链接…

Redis慢日志

SLOWLOG 是用来读取和重置 Redis 慢查询日志的命令&#xff0c;Redis 2.2.12 版本开始支持 1.Redis 慢查询日志概述 客户端从发送命令到获取返回结果经过了以下几个步骤&#xff1a; 1. 客户端发送命令 2. 该命令进入 Redis 队列排队等待执行 3. Redis 开始执行命令 - Red…

飞天使-k8s知识点28-kubernetes散装知识点5-helm安装ingress

文章目录 安装helm添加仓库下载包配置创建命名空间安装 安装helm https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gztar -xf helm-v3.2.3-linux-amd64.tar.gzcd linux-amd64mv helm /usr/local/bin修改/etc/profile 文件&#xff0c;修改里面内容,然后重新启用export PATH$P…

嵌入式数据库-Sqlite3

阅读引言&#xff1a; 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例&#xff0c; 相信仔细学习完这篇内容之后大家一定能有所收获。 目录 一、数据库的基础知识 1.数据库的基本概念 2.常用数据库 3.嵌入式…

在A中删除既在B表中出现又在C表中出现的元素

方法一&#xff08;感觉有点取巧&#xff0c;不太推荐&#xff0c;但是实现简单&#xff09;&#xff1a; 算法思想:保留La的头节点&#xff0c;并用pcur指针指向La链中的第一个结点&#xff0c;通过pcur指针遍历La中的每一个元素&#xff0c;并判断该元素是否在Lb和Lc链中出现…

优化选址问题 | 基于帝国企鹅算法求解工厂-中心-需求点三级选址问题含Matlab源码

目录 问题代码问题 "帝国企鹅算法"并不是一个广为人知的优化算法,可能是一个特定领域或者特定情境下提出的方法。不过,对于工厂-中心-需求点三级选址问题,它可能是一种启发式优化方法,用于在多个候选位置中选择最优的工厂、中心和需求点位置。 这类问题通常涉及…

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程 &#x1f4cd;相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》 ✨stm32使用硬件I2C去读取角度数据&#xff0c;通过STM32CubeMX工具配置工程&#xff0c;读取角度数据&#xff0c;只需要调用一个函数&#xf…