Ⅰ.带权图邻接矩阵
Ⅱ.python程序
import numpy as np
import pandas as pd
from scipy.sparse import coo_matrix
import networkx as nx
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
data=pd.read_excel('附件.xlsx',sheet_name='各地点之间距离',index_col=0)
data=data.fillna(0)
print('矩阵的空值以0填充:\n',data)
data=np.tril(data,-1)
print('\n截取矩阵的下三角部分(上三角部分全部以0填充):\n',data)
coo=coo_matrix(np.array(data))
coo.row+=1
coo.col+=1
data=[int(i) for i in coo.data]
print('\n矩阵转换为稀疏矩阵:')
print(coo)
coo_list=list(zip(coo.row,coo.col,data))
pos={1:(1,8),2:(4,10),3:(11,11),4:(14,8),5:(5,7),6:(10,6),7:(3,5),8:(6,4),9:(8,4),10:(14,5),11:(2,3),12:(5,1),13:(8,1),14:(13,3)}
G=nx.Graph()
G.add_weighted_edges_from(coo_list)
T=nx.minimum_spanning_tree(G,algorithm='kruskal')
print('\n深度优先生成树:')
print(list(nx.dfs_edges(G,source=9)))
T_dfs=nx.dfs_tree(G,source=9)
print(T_dfs.nodes)
print('\n广度优先生成树:')
print(list(nx.bfs_edges(G,source=9)))
T_bfs=nx.bfs_tree(G,source=9)
print(T_bfs.nodes)
print('\n顶点9到各点的最短路径和最短距离:')
for i in range(1,15):
min_path_v1=nx.dijkstra_path(G,source=9,target=i)
min_path_length_v1=nx.dijkstra_path_length(G,source=9,target=i)
print('顶点9到顶点%d的最短路径:%s,顶点9到顶点%d的最短距离:%d'%(i,min_path_v1,i,min_path_length_v1))
plt.figure()
plt.subplot(221)
nx.draw(G,pos,with_labels=True)
labels=nx.get_edge_attributes(G,'weight')
nx.draw_networkx_nodes(G,pos,node_color='yellow')
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels,font_color='purple',font_size=10)
plt.title('原图')
plt.subplot(222)
nx.draw(G,pos,with_labels=True)
nx.draw_networkx_nodes(G,pos,nodelist=T.nodes,node_color='yellow')
nx.draw_networkx_edges(G,pos,edgelist=T.edges,edge_color='green',width=3)
labels2=nx.get_edge_attributes(G,'weight')
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels2,font_color='purple',font_size=10)
plt.title('最小生成树')
plt.subplot(223)
nx.draw(G,pos,with_labels=True)
nx.draw_networkx_nodes(G,pos,nodelist=T_dfs.nodes,node_color='yellow')
nx.draw_networkx_edges(G,pos,edgelist=T_dfs.edges,edge_color='red',width=3)
labels2=nx.get_edge_attributes(G,'weight')
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels2,font_color='purple',font_size=10)
plt.title('深度优先生成树')
plt.subplot(224)
nx.draw(G,pos,with_labels=True)
nx.draw_networkx_nodes(G,pos,nodelist=T_bfs.nodes,node_color='yellow')
nx.draw_networkx_edges(G,pos,edgelist=T_bfs.edges,edge_color='blue',width=3)
labels2=nx.get_edge_attributes(G,'weight')
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels2,font_color='purple',font_size=10)
plt.title('广度优先生成树')
plt.show()
矩阵的空值以0填充:
1 2 3 4 5 6 ... 9 10 11 12 13 14
1 0.0 0.0 0.0 0.0 54.0 0.0 ... 0.0 0.0 26.0 0.0 0.0 0.0
2 0.0 0.0 56.0 0.0 18.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 56.0 0.0 0.0 44.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 28.0 ... 0.0 0.0 0.0 0.0 0.0 0.0
5 54.0 18.0 44.0 0.0 0.0 51.0 ... 48.0 0.0 0.0 0.0 0.0 0.0
6 0.0 0.0 0.0 28.0 51.0 0.0 ... 27.0 42.0 0.0 0.0 0.0 0.0
7 55.0 0.0 0.0 0.0 34.0 0.0 ... 0.0 0.0 0.0 38.0 0.0 0.0
8 0.0 0.0 0.0 0.0 56.0 0.0 ... 29.0 0.0 0.0 33.0 0.0 0.0
9 0.0 0.0 0.0 0.0 48.0 27.0 ... 0.0 61.0 0.0 29.0 42.0 36.0
10 0.0 0.0 0.0 0.0 0.0 42.0 ... 61.0 0.0 0.0 0.0 0.0 25.0
11 26.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 24.0 0.0 0.0
12 0.0 0.0 0.0 0.0 0.0 0.0 ... 29.0 0.0 24.0 0.0 0.0 0.0
13 0.0 0.0 0.0 0.0 0.0 0.0 ... 42.0 0.0 0.0 0.0 0.0 47.0
14 0.0 0.0 0.0 0.0 0.0 0.0 ... 36.0 25.0 0.0 0.0 47.0 0.0
[14 rows x 14 columns]
截取矩阵的下三角部分(上三角部分全部以0填充):
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 56. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[54. 18. 44. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 28. 51. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[55. 0. 0. 0. 34. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 56. 0. 36. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 48. 27. 0. 29. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 42. 0. 0. 61. 0. 0. 0. 0. 0.]
[26. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 38. 33. 29. 0. 24. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 42. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 36. 25. 0. 0. 47. 0.]]
矩阵转换为稀疏矩阵:
(3, 2) 56.0
(5, 1) 54.0
(5, 2) 18.0
(5, 3) 44.0
(6, 4) 28.0
(6, 5) 51.0
(7, 1) 55.0
(7, 5) 34.0
(8, 5) 56.0
(8, 7) 36.0
(9, 5) 48.0
(9, 6) 27.0
(9, 8) 29.0
(10, 6) 42.0
(10, 9) 61.0
(11, 1) 26.0
(12, 7) 38.0
(12, 8) 33.0
(12, 9) 29.0
(12, 11) 24.0
(13, 9) 42.0
(14, 9) 36.0
(14, 10) 25.0
(14, 13) 47.0
深度优先生成树:
[(9, 5), (5, 1), (1, 7), (7, 8), (8, 12), (12, 11), (5, 2), (2, 3), (5, 6), (6, 4), (6, 10), (10, 14), (14, 13)]
[9, 5, 1, 7, 8, 12, 11, 2, 3, 6, 4, 10, 14, 13]
广度优先生成树:
[(9, 5), (9, 6), (9, 8), (9, 10), (9, 12), (9, 13), (9, 14), (5, 1), (5, 2), (5, 3), (5, 7), (6, 4), (12, 11)]
[9, 5, 6, 8, 10, 12, 13, 14, 1, 2, 3, 7, 4, 11]
顶点9到各点的最短路径和最短距离:
顶点9到顶点1的最短路径:[9, 12, 11, 1],顶点9到顶点1的最短距离:79
顶点9到顶点2的最短路径:[9, 5, 2],顶点9到顶点2的最短距离:66
顶点9到顶点3的最短路径:[9, 5, 3],顶点9到顶点3的最短距离:92
顶点9到顶点4的最短路径:[9, 6, 4],顶点9到顶点4的最短距离:55
顶点9到顶点5的最短路径:[9, 5],顶点9到顶点5的最短距离:48
顶点9到顶点6的最短路径:[9, 6],顶点9到顶点6的最短距离:27
顶点9到顶点7的最短路径:[9, 8, 7],顶点9到顶点7的最短距离:65
顶点9到顶点8的最短路径:[9, 8],顶点9到顶点8的最短距离:29
顶点9到顶点9的最短路径:[9],顶点9到顶点9的最短距离:0
顶点9到顶点10的最短路径:[9, 10],顶点9到顶点10的最短距离:61
顶点9到顶点11的最短路径:[9, 12, 11],顶点9到顶点11的最短距离:53
顶点9到顶点12的最短路径:[9, 12],顶点9到顶点12的最短距离:29
顶点9到顶点13的最短路径:[9, 13],顶点9到顶点13的最短距离:42
顶点9到顶点14的最短路径:[9, 14],顶点9到顶点14的最短距离:36