一、实验目的
理解图论的基本概念,图的矩阵表示,图的连通性,图的遍历,以及求图的连通子图方法。
二、实验内容
输入一个无向简单图的邻接矩阵,判断:
(1)图是否连通;
(2)计算结点两两之间长度为m的路径数目;
三、Python代码部分
import numpy as np
#输入邻接矩阵
node=eval(input("请输入无向图有多少节点:"))
matrix = []
for i in range(0, node):
temp = []
temp=input("请输入图像邻接矩阵第"+str(i+1)+"行的真值(0或1):").split()
matrix.append(temp)
#建立数组用于运算
road = np.array(matrix)
road = road.astype(np.int)
long = np.zeros([node,node])
long = long.astype(np.int)
distance = np.zeros([node,node])
distance = distance.astype(np.int)
#把邻接矩阵转换成节点关系图
grap=[]
for i in range(0, node):
temp = []
for j in range(0, node):
if road[i][j]== 1 and road[j][i] == 1:
temp.append(j)
grap.append(temp)
#DFS算法
count=0
stack = []
seen = set()
stack.append(0)
seen.add(0)
while (len(stack)>0):
ver = stack.pop()
notes = grap[ver]
for i in notes:
if i not in seen:
stack.append(i)
seen.add(i)
count=count+1
#判断连通的节点数是否等于总节点数
if count == node:
print("该无向图连通!")
else:
print("该无向图不连通!")
#运算长度为m的路径数量
m=int(input("请输入路的长度:"))
for i in range(0,node):
for j in range(0,node):
long[i][j]=road[i][j]
for l in range(0,m-1):
for i in range(0,node):
for j in range(0,node):
distance[i][j]=0
for k in range(0,node):
distance[i][j]=road[i][k]*long[k][j]+distance[i][j]
for i in range(0,node):
for j in range(0,node):
road[i][j]=distance[i][j]
#输出长度为m的路径矩阵
print("(矩阵第i行第j列表示结点i到结点j长度为",m,"的路的数目)")
print("结点两两之间长度为",m,"的路的数目矩阵为:")
for i in range(0,node):
for j in range(0,node):
print(" ",road[i][j],end="")
print()