图论初入门
目录
一、前言
二、图的概念
三、例题及相关概念
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、全球变暖(2018年省赛,lanqiao0J题号178) 2、欧拉路径 3、小例题 4、例题(洛谷P7771) 一、前言 本文主要讲了树与图的基本概念,图的存储、DFS遍历…...
02-Oracle数据库的启动与关闭
本文章主要讲解Oracle数据库的启动与关闭方法,详细讲解启动Oracle的命令,三种启动数据库的方法及区别;关闭数据库的4种方法及他们的区别。 启动和关闭数据库 •数据库没启动前,只有拥有DBA权限或者以sysoper或sysdba身份才能连接到…...
网络营销培训完能达到什么水平?学完能创业吗?
网络营销本身就是一门创业的技术,很多人学习网络营销,往往担心学完以后技术达不到,再工作几年才可以创业,实际这是错误的理解,那么,网络营销培训完能达到什么水平?新手学员参加网络营销培训&…...
大数据技术之——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模型系列文章中,我们构建了Size因子、Beta因子、Momentum因子和Residual Volatility因子,并分别创建了对应的单因子策略,本节文章在该系列下进一步构建NonLinear Size因子。从回测结果看,自2022年以来&…...
C++ 常用命令行开发工具(Linux)
文章目录1、简介2、gcc / g2.1 system(执行shell 命令)2.2 popen(建立管道I/O)2.3 vforkexec(新建子进程)3、clang3.1 下载和安装clang3.2 clang和gcc比较3.2.1 gcc3.2.2 clang3.2.3 LLVM4、make4.1 例子14…...
java基础学习 day47(抽象类,抽象方法)
1. 抽象方法 将共性的行为(方法)抽取到父类之后,由于每一个子类执行的内容是不一样的,所以,在父类中不能确定具体的方法体,该方法就可以定义为抽象方法。抽象方法定义格式: public abstract 返…...
Java代码弱点与修复之——Open redirect(开放重定向)
弱点描述 Open redirect , 开放重定向,是一种常见的安全漏洞,也被称为“重定向漏洞”。该漏洞通常出现在 Web 应用程序中,攻击者可以利用它将用户重定向到恶意站点,从而进行钓鱼攻击、恶意软件传播、诱骗等活动。 在 Java 中,通过重定向 HTTP 请求来实现应用程序中的跳转…...
Go 指针
指针在编程中,一个内存地址用来定位一段内存。通常地,一个内存地址用一个操作系统原生字(native word)来存储。 一个原生字在32位操作系统上占4个字节,在64位操作系统上占8个字节。 所以,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全景直播技术引领新媒体时代”
随着虚拟现实技术的不断发展,VR全景直播已经成为了越来越受欢迎的直播形式。VR全景直播可以让观众通过虚拟现实设备亲临直播现场,享受身临其境的观看体验。VR全景直播是什么? VR全景直播是虚拟现实技术和直播的结合。相对于传统直播ÿ…...
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函数可以绘制立体的三维散点图,但有时候需要在该立体图中分析X-Y-Z三者的关系,即1副图呈现出4个信息,XYZ综合信息、XY信息、XZ信息、YZ信息。现有的Scatter3无法实现该功能,本文可实现Scatter3三维立体散点图在三个…...
Unity/C#------委托与事件(一篇文章彻底搞懂...)
一:委托 所有的代码语言创造者母语都是英语,我们从英语翻译到中文的过程中难免会存在一些不太能还原本意的词,比如我之前一直不理解构造函数和析构函数,只知道这俩货作用相反,直到我看到了它的英文意思,Con…...
别再为 Jenkins 安装烦恼,Docker 帮你轻松解决
前言 大家好,又见面了,我是沐风晓月,本文收录与云原生相关的专栏,以下是我的简介: 🏠个人主页:我是沐风晓月 🧑个人简介:大家好,我是沐风晓月,双…...
汇编语言程序设计(一)
前言 在学习汇编语言之前,我们应该要知道汇编语言他是一门怎么样的语言。汇编语言是直接工作在硬件上的一门编程语言,学习汇编语言之前最好先了解一下计算机硬件系统的结构和工作原理。学习汇编语言的重点是学习如何利用硬件系统的编程结构和指令集进而…...
【uni-app教程】四、UniAPP 路由配置及页面跳转
四、UniAPP 路由配置及页面跳转 (1) 路由配置 uni-app页面路由为框架统一管理,开发者需要在pages.json里配置每个路由页面的路径及页面样式。类似小程序在 app.json 中配置页面路由一样。所以 uni-app 的路由用法与 Vue Router 不同,如仍希望采用 Vue …...
ROS从入门到精通系列(二十八)-- ROS控制器图形化界面开发
ROS (Robot Operating System, 机器人操作系统) 作为机器人软件中的通信及控制中间件,提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。ROS遵循BSD开源许可协议。 随着机器人智…...
Submodule命令:android如何将自己项目中的某个Module作为gitlab中第三方公共库
一、创建远程公共库 1、Android Studio创建本地仓库 创建一个新的module 在新建module中添加代码(此处示例代码) 右击新建的module,打开新建module的命令行界面, 因为我们只上传这个module的代码,而不是整个项目的代码 命令行中输入以下命令…...
MySQL索引事务
1.索引1.1概念索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结果实现。(这里只用通俗的语言和图片进行介绍)1.2作用数据库中的表…...
ISO27001信息安全管理体系认证
ISO信息安全管理体系认证 一、什么是ISO信息安全管理体系认证? ISO是信息安全管理体系认证,是由国际标准化组织(ISO)采纳英国标准协会BS-2标准后实施的管理体系,成为了“信息安全管理”的国际通用语言,企…...
Linux应用GUI开发C++ 之gtkmm4(1)
目录概述GTKgtkmm安装gtkmm4hello,worldcodelite配置代码解释概述 GTK GTK是一个小部件工具包。GTK创建的每个用户界面都由小部件组成。这是在C语言中使用GObject实现的,GObject是一个面向对象的C语言框架。窗口小部件是主容器。然后通过向窗口中添加按钮、下拉菜…...
选课系统的设计与实现
技术:Java等摘要:目前国内各高校的规模越来越大,进而造成教师教学管理等工作量日趋加大。然而,现代教育的信息化、网络化已经成为教育发展的一个重要方向,同时也为解决高校教学管理效率低下的现状,使管理突…...
关于安卓的一些残缺笔记
安卓笔记Android应用项目的开发过程Android的调试Android项目文档结构Intent的显式/隐式调用Activity的生命周期1个Activity界面涉及到生命周期的情况2个Activity界面涉及到生命周期的情况Android布局的理论讲解Activity界面布局ContentProvider是如何实现数据共享Android整体架…...
MySQL 中的锁有哪些类型,MySQL 中加锁的原则
锁的类型MySQL 找那个根据加锁的范围,大致可以分成全局锁,表级锁和行级锁。全局锁全局锁,就是对整个数据库加锁。加锁flush tables with read lock解锁unlock tables全局锁会让整个库处于只读状态,之后所有的更新操作都会被阻塞&a…...
Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作
场景 Sqlite数据库 SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。 就像其他数据库,SQLite 引擎不…...
2023最新版本RabbitMQ下载安装教程
一、RabbitMQ简介 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。主要用于在进程、应用程序和服务器之间交换数据,可以通过插件支持进行扩展,支持许多协议,并提供高性能、可靠性、集群和高可用队列。 AMQP :Advanced Me…...
如何使用码匠连接 Elasticsearch
目录 在码匠中集成 Elasticsearch 在码匠中使用 Elasticsearch 关于码匠 Elasticsearch 是一个开源的分布式搜索和分析引擎,常用于处理大规模数据集的搜索、实时数据分析和数据挖掘任务。它支持多种数据源,包括关系型数据库(如 MySQL、Pos…...
jmeter学习笔记二(jmeter函数与后置处理器)
Jmeter重要的函数 ${__counter(,)} 计数器 ${__counter(TRUE,)} 默认加1; TRUE,每个用户有自己的计数器;FALSE,使用全局计数器 计数器元件,可以设置起始值,间隔值,最大值。运行结果超过最大值时&a…...
【独家】华为OD机试提供C语言题解 - 子序列长度
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明子序…...
做非经营网站需要营业执照/广告公司简介
开篇 这篇文章主要对Tomcat 解析conf/server.xml文件进行了一下流程的分析,对比server.xml的配置文件和代码部分能够建立起一定的关联即可。 建议有兴趣研究的可以对照代码和server.xml配置文件,这样能够更好的理解。 配置解析流程 配置解析的整体步骤在…...
做外汇网站代理/网络营销是什么
然而并没有什么好论的。。。 直接贴代码算了。。。 ll Mul(ll x,ll y,ll Mod){x(x%ModMod)%Mod;y(y%ModMod)%Mod;return (x*y-(long long)((long double)x/Mod*y0.5)*ModMod)%Mod; } 转载于:https://www.cnblogs.com/yanshannan/p/9649887.html...
郑州品牌网站建设官网/免费技能培训在哪里报名
目录 Kafka的基本介绍Kafka的设计原理分析Kafka数据传输的事务特点Kafka消息存储格式副本(replication)策略Kafka消息分组,消息消费原理Kafak顺序写入与数据读取消费者(读取数据) Kafka的基本介绍 Kafka是最初由Lin…...
wordpress静态cdn/关键词搜索排名软件
0: 由于天朝的特殊,在国内很不好编译(主要是依赖库下载不了)。 所以记录下编译过程 需要的工具: debian 或者其他linux其他版本。 make,git,golang(最好1.11版本以上) 编译过程 export GOPATH/data/tidb mkdir -p /data/tidb/src/githu…...
手机网站设计公司只选亿企邦/网络销售工作靠谱吗
首先说明,这不是一个bug。应该说是一个比较容易中招的陷阱。 今天使用switch遇到一个问题,代码如下: 1 <?php2 3 4 $num 0;5 switch ($price) {6 case $price < 100:7 $price_between "100以下";8 br…...
营销型网站建设 深圳信科/网络营销的工具和方法有哪些
为什么80%的码农都做不了架构师?>>> 在网络环境里,多个服务器通过NFS方式共享一个服务器的存储空间,可能使得NFS服务器不堪重负。一般情况下,当NFS客户端数目较小的时候,NFS性能不会出现问题;一…...