图论初入门

news2024/11/24 9:30:31

目录

一、前言

二、图的概念

三、例题及相关概念

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和边长w
    edge[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 vis
    global m
    global flag
    global N
    vis[x][y]=-1
    d=[(-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=1
    for 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:
            continue
        if 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=0
            dfs(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=False
    if du[i][1]-du[i][0]==1:
        cnt[1]+=1           #cnt[1]用于统计起点数
        S=i
    if 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()

以上,图论初入门

祝好

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch训练第一个项目VOC2007分割

一、环境 condapytorch1.2.0cuda10.0pycharm 二、训练内容 数据集&#xff1a;VOC2007 网络&#xff1a;U-net 功能&#xff1a;分割图像分类 三、步骤 安装软件、框架、包、cuda&#xff08;不安用cpu跑也可以&#xff09;&#xff0c;下载数据集、代码、权重文件等。。…

测试外包干了5年,感觉自己已经废了····

前两天有读者想我资讯&#xff1a; 我是一名软件测试工程师&#xff0c;工作已经四年多快五年了。现在正在找工作&#xff0c;由于一直做的都是外包的项目。技术方面都不是很深入&#xff0c;现在找工作都是会问一些&#xff0c;测试框架&#xff0c;自动化测试&#xff0c;感…

Java Map和Set

目录1. 二叉排序树(二叉搜索树)1.1 二叉搜索树的查找1.2 二叉搜索树的插入1.3 二叉搜索树的删除&#xff08;7种情况&#xff09;1.4 二叉搜索树和TreeMap、TreeSet的关系2. Map和Set的区别与联系2.1 从接口框架的角度分析2.2 从存储的模型角度分析【2种模型】3. 关于Map3.1 Ma…

QML键盘事件

在QML中&#xff0c;当有一个按键按下或释放时&#xff0c;会产生一个键盘事件&#xff0c;将其传递给获得有焦点的QML项目&#xff08;讲focus属性设置为true&#xff0c;则获得焦点&#xff09;。 按键处理的基本流程&#xff1a; Qt接收密钥操作并生成密钥事件。如果 QQuic…

keepalived学习记录:对其vip漂移过程采用gdb跟踪

对其vip漂移过程采用gdb跟踪keepalived工具主要功能产生vip漂移过程两种情况gdb调试常用命令gdb调试时打到的函数栈&#xff08;供学习参考&#xff09;函数栈的图是本人理解下画的&#xff0c;不对请多指正 keepalived主要有三个进程&#xff0c;父进程是core进程&#xff0c;…

python编程:查找某个文件夹下所有的文件,包括子文件加下的所有文件,读取指定类型的文件

目录 一、实现要求 二、代码实现 三、效果测试 一、实现要求 1、在电脑上有一个文件夹&#xff0c;该文件夹下面还有子文件夹&#xff0c;具体层级不清楚&#xff0c;需要实现将该文件夹下所有的文件路径读取出来&#xff1b; 2、在1的基础上&#xff0c;只需读取指定类型的文…

论文复现-2:代码部分

以CONLL03数据集为例 文章目录1 整体框架2 数据结构2.1 原始数据集2.2 处理之后的数据集3 代码部分3.0 模型参数3.1 数据预处理3.2 模型方法3.1.1 定义表示的学习权重项的学习双塔模型3.2.2 forward3.3 损失函数3.4 训练与推理Ablation study训练实例1 整体框架 任务是实体识别…

MVVM模式下如何正确【视图绑定+数据】

概述 我如何&#xff08;不在后面的代码中使用代码&#xff09;自动绑定到我想要的视图&#xff1f;据我了解&#xff0c;如果正确完成&#xff0c;这就是模式应该如何工作。我可以使用主窗口 xaml 中的代码实现这一切&#xff0c;我甚至正确创建了一个资源字典&#xff08;因…

python Pytest生成alluer测试报告的完整教程

1.下载allure包到本地&#xff0c;解压 网上很多资料&#xff0c;这边不提供了 2.配置环境变量 将上面解压后bin文件的路径复制&#xff0c;添加到环境变量Path下 3.验证环境变量配置是否功 在cmd中输入allure&#xff0c;回车 。查看allure是否成功&#xff1a; 4.pyc…

Spring Boot 整合Redis使用Lua脚本实现限流

目录一、简介二、maven依赖三、编码实现3.1、配置文件3.2、配置类3.3、注解类3.4、切面类3.5、lua脚本3.6、自定义异常和全局异常3.7、控制层四、验证4.1、单用户限流4.2、接口限流结语一、简介 本篇文章主要来讲Spring Boot 整合Redis使用Lua脚本实现限流&#xff0c;实现限流…

Lsof命令介绍

LSOF&#xff08;List Open Files&#xff09;是一款功能强大的开源工具&#xff0c;用于列出当前系统上打开的文件和进程。该工具可以帮助系统管理员和开发人员快速查找正在使用某个文件的进程&#xff0c;以及在系统上使用磁盘空间最多的进程。 本文将介绍LSOF的基本用法和常…

计算机网络自检

1 计网体系结构 因特网结构&#xff1a; 计网三个组成成分&#xff1a; 工作方式-其中2个部分&#xff1a; 功能-两个子网&#xff1a; 5个XAN分别是&#xff1a; 传输技术&#xff0c;两者的主要区别&#xff1a; 4种基本网络拓扑结构&#xff1a; 3种交换技术&#xff1a; 协…

南卡NEO骨传导首发新机,超前无线充设计,树立行业标杆!!!

​3月2号&#xff0c;更专业的骨传导运动耳机——南卡&#xff0c;发布了以轻运动为全新方向系列的南卡NEO&#xff0c;通过迭代升级的声学技术进一步的优化了音质&#xff0c;打造更强一代的音质体验。 音质全新升级&#xff0c;分”響“全新体验 一直以来南卡专业的实验团队…

计算机网络第5章(运输层)学习笔记

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

linux环境创建anaconda虚拟环境安装tensorflow-gpu版本

linux环境创建anaconda虚拟环境安装tensorflow-gpu版本1.找到相应版本2.下载步骤2.1选择下载版本2.2 创建虚拟环境2.3 进入虚拟环境2.5 更新三个包2.6 安装tensorflow和keras2.7 验证是否安装成功2.8 检验GPU是否可用2.9 测试代码3.成功&#xff0c;终于成功了&#xff01;&…

spring-boot rabbitmq整合

文章请参考&#xff1a;Springboot 整合RabbitMq &#xff0c;用心看完这一篇就够了 mven依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></depende…

张大大直播爆火?跨境电商直播能从中学到什么

最近这个张大大的直播间确实很火哈&#xff0c;连龙哥这个不怎么看娱乐新闻的也经常刷到。龙哥专门去看了几次张大大的这个直播&#xff0c;确实有点东西。每场都可以做到这么高流量着实是不容易。龙哥就凭借自己一些电商直播经验&#xff0c;给大家总结一下&#xff0c;我们可…

年薪20W软件测试工程师必备的6大技能(建议收藏)

软件测试 随着软件开发行业的日益发展&#xff0c;岗位需求量和行业薪资都不断增长&#xff0c;想要入行的人也是越来越多&#xff0c;但不知道从哪里下手&#xff0c;今天&#xff0c;就给大家分享一下&#xff0c;软件测试行业都有哪些必会的方法和技术知识点&#xff0c;作…

Java知识补充

ArrayList 继承结构 为什么要先继承AbstractList&#xff0c;而让AbstractList先实现List&#xff1f;而不是让ArrayList直接实现List&#xff1f; 这里是有一个思想&#xff0c;接口中全都是抽象的方法&#xff0c;而抽象类中可以有抽象方法&#xff0c;还可以有具体的实现方…

无聊小知识.03 Springboot starter配置自动提示

1、前言Springboot项目配置properties或yaml文件时候&#xff0c;会有很多spring相关的配置提示。这个是如何实现的&#xff1f;如果我们自己的配置属性&#xff0c;能否也自动提示&#xff1f;2、Springboot配置自动提示其实IDE是通过读取配置信息的元数据而实现自动提示的。S…