当前位置: 首页 > news >正文

图论初入门

目录

一、前言

二、图的概念

三、例题及相关概念

1、全球变暖(2018年省赛,lanqiao0J题号178)

2、欧拉路径

3、小例题

4、例题(洛谷P7771)


一、前言

本文主要讲了树与图的基本概念,图的存储、DFS遍历,欧拉路与欧拉回路以及相关例题。

二、图的概念

  • 图:由点 (node,或者vertex) 和连接点的边 (edge) 组成。
  • 图是点和边构成的网。

  • 树 (是一种特殊的图),即连通无环图
  • 树的结点从根开始,层层扩展子树,是一种层次关系,这种层次关系,保证了树上不会出现环路。 
  • 两点之间的路径:有且仅有一条路径。

【图算法的复杂度】

  • 和边的数量E、点的数量V相关。
  • O(V+E):几乎是图问题中能达到的最好程度。
  • O(VlogE)、O(ElogV):很好的算法。
  • O(v^2)、O(E^2)或更高:不算是好的算法。
  • 例:最短路径、树的LCA(最近公共祖先)

【图的存储】

能快速访问:图的存储,能让程序很快定位结点 u 和 v 的边 (u,v)。

  • 数组存边:简单、空间使用最少;无法快递定位
  • 邻接矩阵:简单、空间使用最大;定位最快
  • 邻接表:空间很少,定位较快
  • 链式前向星:空间更少,定位较快

【数组存边】

优点:简单、最省空间。

缺点:无法定位某条边。

应用:最小生成树的kruskal算法

e=[]
for i in range(m):u,v,w=map(int,input().split())e.append((u,v,w))

【邻接矩阵】

  • 二维数组:graph[NUM][NUM]
  • 无向图:graph[i][j] = graph[j][i]
  • 有向图:graph[i][j] != graph[j][i]
  • 权值:graph[i][j] 存结点 i 到 j 的边的权值。例如 graph[1][2]=3,graph[2][1]=5 等等
  • 用 graph[i][j]=INF 表示 i,j 之间无边。

【邻接表】

  • 应用场景:大稀疏图
  • 优点:
  • 存储效率非常高,存储复杂度 O(V+E)
  • 能存储重边

edge=[[] for i in range(N+1)]   #定义邻接表
for i in range(N):u,v,w=map(int,input().split())   #读入点u,v和边长wedge[u].append((v,w))edge[v].append((u,w))   #无向边
for v,w in edge[u]:

【链式前向星】

空间极端紧张,紧凑的存图方法。

相关内容见另一篇博客。

链式前向星_链式前向星 csdn_吕同学的头发不能秃的博客-CSDN博客

【图的遍历和连通性】

  • BFS 和 DFS:图论的基本算法。
  • 图论算法,或者直按用 BFS 和 DFS 来解决问题,或者用其思想建立新的算法。

【如何遍历非连通图】

想象有个虛拟结点 v,它连接了所有点

 在主程序中对这些点逐一进行 dfs()

【用DFS判断连通性】

  • 对需要的点执行 dfs(),就能找到它连通的点。
  • 并查集也能用于检查连通性。

找 e 点的连通性:执行 dfs(e)。

  • 访问过程:见结点上面的数字,顺序是:e, b, d, c, a
  • 递归返回的结果:见结点下面划线数字,顺序是:a, c, d, b, e

三、例题及相关概念

1、全球变暖(2018年省赛,lanqiao0J题号178)

该题目在我写DFS的笔记时就讲过。

见连接:DFS排列组合与连通性_排列组合dfs_吕同学的头发不能秃的博客-CSDN博客

另外我也独立写了一个题解,后面一对和链接里面的很类似。

import sys
sys.setrecursionlimit(65000)def dfs(x,y):global visglobal mglobal flagglobal Nvis[x][y]=-1d=[(-1,0),(1,0),(0,-1),(0,1)]if m[x-1][y]=='#' and m[x+1][y]=='#' and \m[x][y-1]=='#' and m[x][y+1]=='#':flag=1for i in range(4):dx=x+d[i][0]dy=y+d[i][1]if dx<0 or dx>=N or dy<0 or dy>=N:continueif vis[dx][dy]==0 and m[dx][dy]=='#':dfs(dx,dy)N=int(input())
vis=[[0]*(N+1) for _ in range(N+1)]
m=[]
for _ in range(N):m.append(list(input()))cnt=0
for i in range(1,N-1):for j in range(1,N-1):if vis[i][j]==0 and m[i][j]=='#':flag=0dfs(i,j)if flag==0:cnt+=1
print(cnt)

2、欧拉路径

【欧拉路】

  • 欧拉路:从图中某个点出发,遍历整个图,图中每条边通过且只通过一次。
  • 欧拉回路:起点和终点相同的欧拉路。

欧拉路问题:

1)是否存在欧拉路

2)打印出欧拉路

通过处理度 (degree):一个点上连接的边的数量,称为这个点的度数。

在无向图中,如果度数是奇数,这个点称为奇点,否则称为偶点。 

【欧拉路和欧拉回路是否存在】

1)无向连通图的判断条件如果图中的点全都是偶点,则存在欧拉回路;任意一点都可以作为起点和终点。如果只有 2 个奇点,则存在欧拉路,其中一个奇点是起点,另一个是终点。不可能出现有奇数个奇点的无向图。

2)有向连通图的判断条件 

把一个点上的出度记为 1,入度记为 -1,这个点上所有出度和入度相加,就是它的度数。一个有向图存在欧拉回路,当且仅当该图所有点的度数为零。如果只有一个度数为 1 的点,一个度数为 -1的点,其它所有点的度数为0, 那么存在欧拉路径,其中度数为 1 的是起点,度数为 -1 的是终点。

3、小例题

有 n 个珠子。每个珠子有两种颜色,分布在珠子的两边。一共有 50 种不同的颜色。把这些珠子串起来,要求两个相邻的珠子接触的那部分颜色相同。问是否能连成一个珠串项链?如果能,打印一种连法。

  • 答:这一题是典型的无向图求欧拉回路。首先,判断所有的点是否为偶点,如果存在奇点,则没有欧拉回路;其次,判断所给的图是否连通,不连通也不是欧拉回路。

【输出一个欧拉回路】

对一个无向连通图做 DFS,就输出了一个欧拉回路。

【DFS与欧拉回路】

DFS的结果是一个欧拉回路。

4、例题(洛谷P7771)

原题链接:【模板】欧拉路径 - 洛谷

【题目描述】

求有向图字典序最小的欧拉路径

【输入格式】

第一行 2 个整数 n、m,表示有向图的点数和边数。下面 m 行,每行 2 个整数 u、v,表示存在一个有向边边 u->v

【输出格式】

如果不存在欧拉路径,输出一行 No。

否则输出一行 m+1 个数字,表示字典序最小的欧拉路径。

python题解只能过60%

import sys
def dfs(u):i=d[u]          #从点u的第一条边i=0开始while i<len(G[u]):d[u]=i+1    #后面继续走u的下一条边dfs(G[u][i])    #继续走这条边的邻居点i=d[u]          #第一条边走过了,不再重复走rec.append(u)M=100010
n,m=map(int,input().split())
du=[[0 for _ in range(2)] for _ in range(M)] #记录每个点的入度、出度
G=[[] for _ in range(n+5)]      #邻接表存图
d=[0 for _ in range(M)]         #d[u]=i;当前走u的第i个边
rec=[]                      #记录欧拉路for i in range(m):u,v=map(int,input().split())G[u].append(v)du[u][1]+=1     #出度du[v][0]+=1     #入度for i in range(1,n+1):G[i].sort()         #对邻居点排序,字典序S=1
cnt=[0,0]
flg=True
for i in range(1,n+1):if du[i][1]!=du[i][0]:  #当出度≠入度时,该点就为奇点,此时图存在奇点flg=Falseif du[i][1]-du[i][0]==1:cnt[1]+=1           #cnt[1]用于统计起点数S=iif du[i][0]-du[i][1]==1:cnt[0]+=1
if (not flg) and (not (cnt[0]==cnt[1] and cnt[0]==1)): #存在奇点,且不是只有一个起点和一个终点print("No",end='')sys.exit(0)
dfs(S)
rec=rec[::-1]           #反过来,回溯的顺序是欧拉路
#print(''.join(str(i) for i in rec))
print(rec[0],end='')
for i in range(1,len(rec)):print(" %d"%rec[i],end='')
print()

以上,图论初入门

祝好

 

相关文章:

图论初入门

目录 一、前言 二、图的概念 三、例题及相关概念 1、全球变暖&#xff08;2018年省赛&#xff0c;lanqiao0J题号178&#xff09; 2、欧拉路径 3、小例题 4、例题&#xff08;洛谷P7771&#xff09; 一、前言 本文主要讲了树与图的基本概念&#xff0c;图的存储、DFS遍历…...

02-Oracle数据库的启动与关闭

本文章主要讲解Oracle数据库的启动与关闭方法&#xff0c;详细讲解启动Oracle的命令&#xff0c;三种启动数据库的方法及区别&#xff1b;关闭数据库的4种方法及他们的区别。 启动和关闭数据库 •数据库没启动前&#xff0c;只有拥有DBA权限或者以sysoper或sysdba身份才能连接到…...

网络营销培训完能达到什么水平?学完能创业吗?

网络营销本身就是一门创业的技术&#xff0c;很多人学习网络营销&#xff0c;往往担心学完以后技术达不到&#xff0c;再工作几年才可以创业&#xff0c;实际这是错误的理解&#xff0c;那么&#xff0c;网络营销培训完能达到什么水平&#xff1f;新手学员参加网络营销培训&…...

大数据技术之——zeppelin数据清洗

一、zeppelin的安装zeppelin解压后进入到conf配置文件界面。修改zeppelin-site.xml[roothadoop02 conf]# cp zeppelin-site.xml.template zeppelin-site.xml[roothadoop02 conf]# vim zeppelin-site.xml将IP地址和端口号设置成自己的修改 zeppelin-env.shexport JAVA HOME/opt/…...

Barra模型因子的构建及应用系列五之NonLinear Size因子

一、摘要 在前期的Barra模型系列文章中&#xff0c;我们构建了Size因子、Beta因子、Momentum因子和Residual Volatility因子&#xff0c;并分别创建了对应的单因子策略&#xff0c;本节文章在该系列下进一步构建NonLinear Size因子。从回测结果看&#xff0c;自2022年以来&…...

C++ 常用命令行开发工具(Linux)

文章目录1、简介2、gcc / g2.1 system&#xff08;执行shell 命令&#xff09;2.2 popen&#xff08;建立管道I/O&#xff09;2.3 vforkexec&#xff08;新建子进程&#xff09;3、clang3.1 下载和安装clang3.2 clang和gcc比较3.2.1 gcc3.2.2 clang3.2.3 LLVM4、make4.1 例子14…...

java基础学习 day47(抽象类,抽象方法)

1. 抽象方法 将共性的行为&#xff08;方法&#xff09;抽取到父类之后&#xff0c;由于每一个子类执行的内容是不一样的&#xff0c;所以&#xff0c;在父类中不能确定具体的方法体&#xff0c;该方法就可以定义为抽象方法。抽象方法定义格式&#xff1a; public abstract 返…...

Java代码弱点与修复之——Open redirect(开放重定向)

弱点描述 Open redirect , 开放重定向,是一种常见的安全漏洞,也被称为“重定向漏洞”。该漏洞通常出现在 Web 应用程序中,攻击者可以利用它将用户重定向到恶意站点,从而进行钓鱼攻击、恶意软件传播、诱骗等活动。 在 Java 中,通过重定向 HTTP 请求来实现应用程序中的跳转…...

Go 指针

指针在编程中&#xff0c;一个内存地址用来定位一段内存。通常地&#xff0c;一个内存地址用一个操作系统原生字&#xff08;native word&#xff09;来存储。 一个原生字在32位操作系统上占4个字节&#xff0c;在64位操作系统上占8个字节。 所以&#xff0c;32位操作系统上的理…...

shardingsphere5.1.1分表分库yaml配置 自定义策略

前言通过阅读官方稳定给出示例 https://shardingsphere.apache.org/document一、基本配置示例spring:sharding:datasource:names: ds0, ds1ds0:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db0username: rootpassword: rootds1:driver-class-na…...

“探索未来:VR全景直播技术引领新媒体时代”

随着虚拟现实技术的不断发展&#xff0c;VR全景直播已经成为了越来越受欢迎的直播形式。VR全景直播可以让观众通过虚拟现实设备亲临直播现场&#xff0c;享受身临其境的观看体验。VR全景直播是什么&#xff1f; VR全景直播是虚拟现实技术和直播的结合。相对于传统直播&#xff…...

Spring Cloud(微服务)学习篇(六)

Spring Cloud(微服务)学习篇(六) 2 Sentinel实现流量规则(控制台版) 2.1 变更pom.xml(shop-user-server项目)代码 2.1.1 加入如下依赖 <!--熔断限流--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-…...

MATLAB-Scatter3-三维散点图投影至XYZ三个平面

MATLAB-Scatter3函数可以绘制立体的三维散点图&#xff0c;但有时候需要在该立体图中分析X-Y-Z三者的关系&#xff0c;即1副图呈现出4个信息&#xff0c;XYZ综合信息、XY信息、XZ信息、YZ信息。现有的Scatter3无法实现该功能&#xff0c;本文可实现Scatter3三维立体散点图在三个…...

Unity/C#------委托与事件(一篇文章彻底搞懂...)

一&#xff1a;委托 所有的代码语言创造者母语都是英语&#xff0c;我们从英语翻译到中文的过程中难免会存在一些不太能还原本意的词&#xff0c;比如我之前一直不理解构造函数和析构函数&#xff0c;只知道这俩货作用相反&#xff0c;直到我看到了它的英文意思&#xff0c;Con…...

别再为 Jenkins 安装烦恼,Docker 帮你轻松解决

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文收录与云原生相关的专栏&#xff0c;以下是我的简介&#xff1a; &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是沐风晓月&#xff0c;双…...

汇编语言程序设计(一)

前言 在学习汇编语言之前&#xff0c;我们应该要知道汇编语言他是一门怎么样的语言。汇编语言是直接工作在硬件上的一门编程语言&#xff0c;学习汇编语言之前最好先了解一下计算机硬件系统的结构和工作原理。学习汇编语言的重点是学习如何利用硬件系统的编程结构和指令集进而…...

【uni-app教程】四、UniAPP 路由配置及页面跳转

四、UniAPP 路由配置及页面跳转 (1) 路由配置 uni-app页面路由为框架统一管理&#xff0c;开发者需要在pages.json里配置每个路由页面的路径及页面样式。类似小程序在 app.json 中配置页面路由一样。所以 uni-app 的路由用法与 Vue Router 不同&#xff0c;如仍希望采用 Vue …...

ROS从入门到精通系列(二十八)-- ROS控制器图形化界面开发

ROS (Robot Operating System, 机器人操作系统) 作为机器人软件中的通信及控制中间件,提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。ROS遵循BSD开源许可协议。 随着机器人智…...

Submodule命令:android如何将自己项目中的某个Module作为gitlab中第三方公共库

一、创建远程公共库 1、Android Studio创建本地仓库 创建一个新的module 在新建module中添加代码(此处示例代码) 右击新建的module&#xff0c;打开新建module的命令行界面&#xff0c; 因为我们只上传这个module的代码&#xff0c;而不是整个项目的代码 命令行中输入以下命令…...

MySQL索引事务

1.索引1.1概念索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结果实现。&#xff08;这里只用通俗的语言和图片进行介绍&#xff09;1.2作用数据库中的表…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...