Python使用邻接矩阵实现图及Dijkstra算法问题
作者:科恩兄弟 发布时间:2022-09-30 01:22:00
标签:Python,邻接矩阵,Dijkstra
使用邻接矩阵实现图及Dijkstra算法
# 邻接矩阵实现无向图 Dijkstra算法
inf = float("inf")
class Graph():
def __init__(self, n):
self.vertexn = n
self.gType = 0
self.vertexes = [inf]*n
self.arcs = [self.vertexes*n] # 邻接矩阵
self.visited = [False]*n # 用于深度遍历记录结点的访问情况
def addvertex(self, v, i):
self.vertexes[i] = v
def addarcs(self, row, column, weight):
self.arcs[row][column] = weight
# 深度优先遍历
def DFS(self, i):
j = 0
print("vertex:{}".format(self.vertexes[i]), end=" ") # 先打印访问到的节点
self.visited[i] = True
while j < self.vertexn:
if (self.arcs[i][j] != inf) and (not self.visited[j]):
print(self.arcs[i][j], end=" ")
self.DFS(j)
j += 1
# 广度优先遍历
def BFS(self, k):
self.visited = [False]*self.vertexn # 访问性重置
q = []
print("vertex:{}".format(self.vertexes[k]), end=" ")
self.visited[k] = True
q.append(k)
while q != []:
i = q.pop(0)
for j in range(self.vertexn):
if(self.arcs[i][j] != inf) and (not self.visited[j]):
print(self.arcs[i][j], end=" ") # 父节点与子节点的距离
print("vertex:{}".format(self.vertexes[j]), end=" ")
self.visited[j] = True
q.append(j)
# 最短路径算法-Dijkstra 输入点v0,找到所有点到v0的最短距离
def Dijkstra(self, v0):
# 初始化操作
D = [inf]*self.vertexn # 用于存放从顶点v0到v的最短路径长度
path = [None]*self.vertexn # 用于存放从顶点v0到v的路径
final = [None]*self.vertexn # 表示从v0到v的最短路径是否找到最短路径
for i in range(self.vertexn):
final[i] = False
D[i] = self.arcs[v0][i]
path[i] = "" # 路径先置空
if D[i] < inf:
path[i] = self.vertexes[i] # 如果v0直接连到第i点,则路径直接改为i
D[v0] = 0
final[v0] = True
###
for i in range(1, self.vertexn):
min = inf # 找到离v0最近的顶点
for k in range(self.vertexn):
if(not final[k]) and (D[k] < min):
v = k
min = D[k]
final[v] = True # 最近的点找到,加入到已得最短路径集合S中 此后的min将在处S以外的vertex中产生
for k in range(self.vertexn):
if(not final[k]) and (min+self.arcs[v][k] < D[k]):
# 如果最短的距离(v0-v)加上v到k的距离小于现存v0到k的距离
D[k] = min+self.arcs[v][k]
path[k] = path[v]+","+self.vertexes[k]
return D, path
if __name__ == "__main__":
g = Graph(5)
g.vertexes = ["A", "B", "C", "D", "E"]
g.arcs = [[inf, 60, 80, 30, inf], [60, inf, 40, 75, inf], [
80, 40, inf, inf, 35], [30, 75, inf, inf, 45], [inf, inf, 35, 45, inf]]
print("深度优先遍历:")
g.DFS(0)
print("\n广度优先遍历:")
g.BFS(0)
print()
print("Dijkstra搜索点到图中各点的最短路径:")
D, path = g.Dijkstra(0)
print(D)
print(path)
将邻接矩阵输出成图
利用networkx,numpy,matplotlib,将邻接矩阵输出为图形。
1,自身确定一个邻接矩阵,然后通过循环的方式添加变,然后输出图像
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
G = nx.Graph()
Matrix = np.array(
[
[0, 1, 1, 1, 1, 1, 0, 0], # a
[0, 0, 1, 0, 1, 0, 0, 0], # b
[0, 0, 0, 1, 0, 0, 0, 0], # c
[0, 0, 0, 0, 1, 0, 0, 0], # d
[0, 0, 0, 0, 0, 1, 0, 0], # e
[0, 0, 1, 0, 0, 0, 1, 1], # f
[0, 0, 0, 0, 0, 1, 0, 1], # g
[0, 0, 0, 0, 0, 1, 1, 0] # h
]
)
for i in range(len(Matrix)):
for j in range(len(Matrix)):
G.add_edge(i, j)
nx.draw(G)
plt.show()
2,有向图
G = nx.DiGraph()
G.add_node(1)
G.add_node(2)
G.add_nodes_from([3, 4, 5, 6])
G.add_cycle([1, 2, 3, 4])
G.add_edge(1, 3)
G.add_edges_from([(3, 5), (3, 6), (6, 7)])
nx.draw(G)
# plt.savefig("youxiangtu.png")
plt.show()
3,5节点完全图
G = nx.complete_graph(5)
nx.draw(G)
plt.savefig("8nodes.png")
plt.show()
4,无向图
G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_nodes_from([3, 4, 5, 6])
G.add_cycle([1, 2, 3, 4])
G.add_edge(1, 3)
G.add_edges_from([(3, 5), (3, 6), (6, 7)])
nx.draw(G)
# plt.savefig("wuxiangtu.png")
plt.show()
5,颜色节点图
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (1, 4), (1, 5), (4, 5), (4, 6), (5, 6)])
pos = nx.spring_layout(G)
colors = [1, 2, 3, 4, 5, 6]
nx.draw_networkx_nodes(G, pos, node_color=colors)
nx.draw_networkx_edges(G, pos)
plt.axis('off')
# plt.savefig("color_nodes.png")
plt.show()
将图转化为邻接矩阵,再将邻接矩阵转化为图,还有图的集合表示,邻接矩阵表示,图形表示,这三种表现形式互相转化的问题是一个值得学习的地方。
来源:https://blog.csdn.net/Joker_Lord/article/details/103396854


猜你喜欢
- vscode配置ruby开发环境vscode近年来发展迅速,几乎在3年之间就抢占了原来vim、sublime text的很多份额,犹记得在2
- 如何定义多对多关系Django 本身自带了一个很强大的ORM,支持自定义model并将其映射到数据库的表中model中可以定义各种类型的数据
- 在获取 IP 时,已经成功将各个网站的代理 IP 获取下来了,然后就需要一个检测模块来对所有的代理进行一轮轮的检测,检测可用就设置为满分,不
- JavaScript的Array对象有一个sort方法,用于实现对数组元素的排序,该方法默认按照数组项ASCII 字符顺序升序排列
- 下面看下Ubuntu 18.04.4安装mysql的过程,内容如下所示:1 sudo apt-get update2 sudo a
- Menu(菜单)组件用于实现顶级菜单、下拉菜单和弹出菜单。何时使用 Menu 组件?Menu 组件通常被用于实现应用程序上的各种菜单,由于该
- asp+access用户登录代码,loginnew.asp网面包含了登录框及验证用户的代码an.mdb数据库名fd表名y_username用
- 以下的文章主要向大家介绍的是实现MySQL远程访问的实际操作流程,以及在实现MySQL远程访问的过程中哪些的相关事项是十分重要的,以下就是文
- Python用input输入列表的方法使用input输入数据时,使用逗号隔开列表的每一项,再使用ast.literal_eval()方法转成
- 用法:matplotlib.pyplot.stem(*args, linefmt=None, markerfmt=None, basefmt
- 最近,在做一个项目时遇到的了一个问题,主线程无法捕获子线程中抛出的异常。先看一个线程类的定义'''''
- 本文实例讲述了Python学习笔记之字符串和字符串方法。分享给大家供大家参考,具体如下:字符串在 python 中,字符串的变量类型显示为
- 导语元宵节,又称上元节、灯节,是春节之后的第一个重要节日。相传,汉文帝(前179—前157年)为庆祝周勃于正月十五勘平诸
- 问题:如何用ASP实现点击数统计?比如我要实现某篇文章被浏览一次就增加一个点击数,该怎么做?回答:就是说,比如,你的页面是:shownews
- 原理:第一步:应用程序把查询SQL语句发给服务器端执行。我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给
- 映射类型操作符(1)标准类型操作符 字典可以和所有的标准
- 平时写得多的是python,最近看了一点go,今天碰到了一个问题,和大家分享一下package mainimport "fmt&q
- logging是python语言中的一个日志模块,专门用来写日志的,日志级别通常分为debug、info、warning、error、cri
- 本文实例讲述了Python使用pickle模块储存对象操作。分享给大家供大家参考,具体如下:众所周知,当我们需要储存数据的时候,就需要用到重
- 需求目标执行Python程序的时候在控制台输出内容的时候只显示一行,然后自动刷新内容,像这样:Downloading File FooFil