首页 > 其他分享 >图论2图的应用补充

图论2图的应用补充

时间:2024-12-02 21:29:17浏览次数:6  
标签:图论 val 补充 max int range 应用 input INF

图论1基础内容-CSDN博客

图的应用

4.1 拓扑排序

拓扑排序针对有向无环图的顶点进行线性排列的算法,使得对于任何来自顶点A指向顶点B的边,A都在序列中出现在B之前。这样的排序存在于有向无环图中,而对于非有向无环图则不存在拓扑排序。

拓扑排序也可以用来检测图中有无成环

4.2 最小生成树

生成树是连通图的极小连通子图,多一条边就会成环,少一条边即无法构成连通图

生成树的代价:

G=(V,E)是一个无向连通图,代价是生成树上各边的边权和

生成树代价=9+49+11+1+21=91

最小生成树即是代价最小的生成树

上图中代价min=1+7+10+7+5=30

最小生成树解析

4.2.1 Kruskal(加边)

将边从小到大排序

利用并查集 合并边

如果该边的加入不会成换,则加入,否则不加入

时间复杂度分析:边排序时间+并查集时间

蓝桥账户中心

蓝桥889

# n 个交叉路口 -- n个点 m条边 无向图
# 最小生成树
# 1≤n≤300,1≤m≤1e5  边>>点 稠密图 最好用Prmie
# Kruskal版
n,m = map(int,input().split())
# 存图
e = []
# m条边 连边
for i in range(m):
  u,v,c = map(int,input().split())
  e.append((c,u,v)) # 把分值c放第一位,方便后续排序
# 边排序
e.sort()
# 把所有的交叉路口直接或间接的连通起来 -- 并查集
p = list(range(n+1))
# 递归找根
def find_root(x):
  if x != p[x]:
    p[x] = find_root(p[x])
  return p[x]
# 从小到大遍历所有边,进行合并 找最小的生成树
# sum记录边权和,max_val记录最大的边权
sum, max_val = 0,0
for w,u,v in e:
  rootu = find_root(u)
  rootv = find_root(v)
  if rootv != rootu:
    p[rootv] = rootu
    # 合并次数+1 修路的条数+1
    sum += 1
    max_val = max(max_val,w)
print(sum,max_val)

4.2.2 Prime(加点)

算法流程:d[i]表示点i和集合的距离

选择一个初始点(随意)u加入集合S,d[u]=0

利用点u更新其它的点(加入离当前集合最近的点)

在d中选择最小未加入集合的点作为新一轮的u

重复上述至所有点加入集合(过程中有两个分区,一个是加入集合的点,另一个是还未加入的点)

# 蓝桥889
# n 个交叉路口 -- n个点 m条边 无向图
# 最小生成树
# 1≤n≤300,1≤m≤1e5  边>>点 稠密图 最好用Prmie
# Prime版
import math
n,m = map(int,input().split())
INF = math.inf
# 存图
mapp = [[INF]*(n+1) for _ in range(n+1)]
for _ in range(m):
  u,v,w = map(int,input().split())
  mapp[u][v] = mapp[v][u] = min(mapp[u][v],w)
# 定义集合d
d = [INF] * (n+1)
max_val = 0
# 初始化d[1]=0
u = 1
# 跑Prime加点
for i in range(n-1): # 除去第一个点,还有n-1个点
  d[u] = 0
  # 初始化下一个点,下一条边
  next_u = 0
  next_val = INF
  for v in range(1,n+1):
    if d[v] == 0: continue # 该点不与当前集合d连通
    d[v] = min(d[v], mapp[u][v]) # mapp[u][v]点u到v的边权
    # 第i次加点时找到离当前集合更近的点
    if d[v] < next_val:
      next_val = d[v]
      next_u = v
  # 基于上一轮扩大下一轮集合,更新d
  u = next_u
  max_val = max(next_val, max_val)
print(n-1, max_val)

4.3 最短路问题

最短路径是两个顶点之间经历的边上边权之和最小的可达路径

4.3.1 Floyed

用于处理多源最短路,从多个点出发到一个点的最短路,可以存在负权边。

蓝桥账户中心

蓝桥8336

# n点m边
# floyd 利用动态规划 三层循环
# 定义dp[k][i][j]表示点i到点j的路径(除去起点和终点)中编号最大不超过k的情况下,i到j的最短距离
# 当加入 第k个点 作为i到j的 中间点
# dp[k][i][j] = mian(dp[k-1][i][j], dp[k-1][i][k]+dp[k-1][k][j])
import math
n,m = map(int,input().split())
# 城市i的商品产量
a = [0] * (n+1)
# 城市i的商品生产成本
p = [0] * (n+1)
# 城市i的商品售卖单价
s = [0] * (n+1)
INF = math.inf
# 一件商品从城市i运往城市j的利润:gi,j=sj-pi-fij
# 其中fi,j是路径费用
f = [[INF] *(n+1) for _ in range(n+1)] # fij为INF表示不通路
g = [[0] *(n+1) for _ in range(n+1)] 
# 输入a,p,s
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)
# 对角线费用为0 n个点 
for i in range(1,n+1):
  f[i][i] = 0 
# floyd 动态规划 三层循环 跑一遍多源全图最短路填f路费表
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])
# 填完路费 现在算利润 填g 把i城市生产的产品送到城市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]
# 求全图的最大利润
max_g = 0
for i in range(1,n+1):
  # 在第二层循环中作一个判断是否有交易的依据
  max_s = -1
  for j in range(1,n+1):
    max_s = max(max_s,g[i][j])
  max_g += max(0, max_s) * a[i] # 乘上产品数量
print(max_g) 

4.3.2 Dijkstra

用于处理单源最短路,从一个点出发到一个点的最短路,不可以存在负权边。

# n点m边 有向图
# 从皇宫到每个建筑的最短路径是多少 -- 单源最短路
from queue import PriorityQueue
import math
INF = math.inf
# dijkstra ,s:起点
def dijkstra(s):
  # 求从起点s出发到各个点i的最短路径
  # d[i]表示从起点s出发到点i的最短的最短路径
  d = [INF]*(n+1)
  # vis[i]表示第i个点是否出队列
  vis = [0]*(n+1)
  # 创建优先队列
  q = PriorityQueue()
  # 起点初始化距离0
  d[s] = 0
  # 起点入队列
  q.put((d[s],s))
  # 当队列非空
  while q.queue:
    dis,u = q.get()
    # 每个点只有第一次出队列有效
    if vis[u]:continue
    vis[u] = 1
    # 松弛 找离当前点在连通状态下的最近点
    for v,w in G[u]:
      if d[v] > d[u] + w:
        d[v] = d[u] + w
        q.put((d[v],v))
  # 处理完成d数组后按题目要求不通的距离为视为-1      
  for i in range(n+1):
    if d[i] == INF:
      d[i] = -1
  print(*d[1:],sep=' ')


n,m = map(int,input().split())
# 存图
G = [[] for i in range(n+1)]
for _ in range(m):
  u,v,w = map(int,input().split())
  G[u].append([v,w])
dijkstra(1)

标签:图论,val,补充,max,int,range,应用,input,INF
From: https://blog.csdn.net/yuange1666/article/details/144122409

相关文章

  • Nuxt.js 应用中的 close 事件钩子
    title:Nuxt.js应用中的close事件钩子date:2024/12/2updated:2024/12/2author:cmdragonexcerpt:close钩子在Nuxt.js的Nitro模块生命周期中起着重要的作用。当Nitro关闭时,这个钩子会被调用。通常用于进行清理操作或释放资源,确保应用在关闭时不会造成资源泄漏......
  • 实验五 C语言指针应用编程
    实验五C语言指针应用编程实验任务1——数组求最大最小值#include<stdio.h>#defineN5voidinput(intx[],intn);voidoutput(intx[],intn);voidfind_min_max(intx[],intn,int*pmin,int*pmax);intmain(){ inta[N]; intmin,max; printf("录入%d个数......
  • 使用Tauri创建桌面应用
    当前是在Windows环境下1.准备系统依赖项MicrosoftC++构建工具WebView2(Windows10v1803以上版本不用下载,已经默认安装了)下载安装Rust下载安装Rust需要重启终端或者系统重新打开cmd,键入rustc--version,出现rust版本号,说明安装成功2.开始#npmnpmcr......
  • 低配电脑也能轻松渲染珠宝动画:云渲染技术的应用
    珠宝设计中,动画渲染至关重要,但高配置需求常成障碍。云渲染技术解决了这一问题,让低配电脑也能轻松完成高质量渲染,释放设计师的创意潜力。本文将探讨云渲染如何革新珠宝设计行业。一、渲染配置要求在珠宝设计渲染的过程中,硬件配置对于实现高效和高质量的渲染至关重要。其中,CPU(中......
  • ARIMA-神经网络混合模型在时间序列预测中的应用
    ARIMA-神经网络混合模型在时间序列预测中的应用1.引言1.1研究背景与意义时间序列预测在现代数据科学中扮演着越来越重要的角色。从金融市场的价格走势到工业生产的需求预测,从气象数据的天气预报到用电量的负荷预测,时间序列分析无处不在。传统的统计方法和现代深度学......
  • 华为技术专家出品,《华为开发者空间案例指南》带你玩转云上20+场景应用开发
    随时随地都能开启开发之旅,这是一种怎样奇妙的体验? 想象一下,无需安装繁琐的IDE,也不用搭建复杂的开发环境,只需开机,就能迅速投入项目开发。 在华为开发者空间,你可以基于免费领取的云主机,轻松探索各种技术可能。比如进行AI风格的编程、打造电商平台秒杀抢购功能、为网站添加AI......
  • 拥抱现代化信息技术:揭秘开工快线商砼ERP自动化生产管理系统在预拌混凝土生产管理中的
     预拌混凝土生产管理的难点主要包括原材料质量控制、生产调度、物流配送、成本控制、客户服务等方面。利用现代化信息技术,特别是如惠邦科技的开工快线商砼自动化生产管理系统这样的专业软件,可以有效地解决这些难点。以下是如何利用现代化信息技术进行改进的分析:1.原材料质......
  • 实验5 C语言指针应用编程
    一,实验目的1,深度理解使用指针变量间接访问数据,代码2,会使用指针变量间接访问一维数组元素,二维数组元素3,会使用指针变量处理字符串4,会使用指针变量作为函数参数(形参,实参)和返回值5,能灵活应用数组,指针,函数,编程解决实际问题二,实验准备使用指针间接访问数组(一维,两维)指针作为函数......
  • 水域智能监管视频分析服务器水面异常漂浮物算法识别技术与应用科普
    随着城市化进程的加快,水域污染问题日益严重,水面漂浮物成为影响水体质量和生态平衡的重要因素。为了有效监管水域环境,提高水质监测的实时性与准确性,智能监控技术逐渐进入水域监管领域。本文将探讨基于视频分析服务器的水面异常漂浮物识别算法的原理及应用,为水域智能监管提供技术支......
  • Docker常用应用之稍后阅读
    1.简介wallabag是一款开源的,可以自托管的稍后阅读工具。提供了浏览器插件和手机客户端,可以很方便的收藏文章用于稍后再看。wallabag官网,wallabaggithub地址,wallabagdockerhub2.部署2.1.docker部署cd/docker_data/mkdir-pwallabag/datacdwallabagvidocker-compose.y......