图序列判定程序

  • Post author:
  • Post category:其他


图序列判定程序

程序说明:通过软件界面输入任意一个有限非负整数序列(中间用空格’ ‘隔开),如果是图序列,界面上显示一个对应的简单图,否则,界面上显示“否”。

使用示例:

输入[input]:[5 4 3 2 1 1 1 1]

输出[output]:

输出图序列对应的一个简单图

相关实现代码如下:

'''
通过软件界面输入任意一个有限非负整数序列,
如果是图序列,界面上显示一个对应的简单图,
否则,界面上显示“否”。
'''
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

seq_input = [int(n) for n in input("输入一个序列:").split()]  # 输入一个序列
seq_input.sort(reverse=True)  # 将输入的序列降序排列
print("序列按降序排列:", seq_input)

# 若序列的和为奇数,则不是图的度序列
sum_seq_input = np.sum(seq_input)
if sum_seq_input % 2 == 1:
    print("该序列不是图序列!")
else:
    seq_input = np.array(seq_input)  # 将输入转化为np数组
    seq_len = seq_input.size  # 获取序列长度
    n = seq_len
    matrix_adj = np.zeros((n, n))  # 生成一个nxn的邻接矩阵
    matrix_iter = np.array([seq_input])  # 初始化序列矩阵,保存每一次循环过后的序列结果

    ite_num = 0
    # 循环求解删除第一个点以及对应的边后的子图的序列
    while ((seq_input < 0).any() == False) & ((seq_input == 0).all() == False):

        # 当最大度点的度数大于n-1时,不存在简单图
        if (seq_input[0]+1) > n:
            print("该序列不是图序列!")
            break

        # 循环次数计数
        ite_num = ite_num + 1
        print("第", ite_num, "轮递归")

        # 执行简单图度序列判定算法
        for i in range(0, seq_input[0]+1):
            seq_input[i] = seq_input[i]-1
        seq_input = np.delete(seq_input, 0)  # 删去剩余序列的第一个点
        n = n-1
        # 由于np.sort函数只能升序排列,因此对其相反数进行升序排列后再取相反数
        seq_input = np.sort(-seq_input)
        seq_input = (-seq_input)
        print(seq_input)

        # 更新序列矩阵
        d_inst = np.pad(seq_input, (ite_num, 0), 'constant', constant_values=(0, 0))
        matrix_iter = np.insert(matrix_iter, ite_num, values=d_inst, axis=0)

    # 循环结束,判断是否是全0还是有负数
    if (seq_input < 0).any():
        print("该序列不是图序列!")
    elif (seq_input == 0).all():

        # 当可以是图序列的时候,利用迭代矩阵更新邻接矩阵
        for i in range(ite_num-1, -1, -1):  # 行遍历
            for k in range(i+1, seq_len, 1):  # 列遍历
                matrix_adj[i, k] = matrix_iter[i, k] - matrix_iter[i+1, k]
                matrix_adj[k, i] = matrix_iter[i, k] - matrix_iter[i+1, k]
        print("该序列对应的图的邻接矩阵:")
        print(matrix_adj)

        # 使用networkx进行绘图
        G = nx.Graph()
        Matrix = matrix_adj

        # 当邻接矩阵中对应的点之间的值为1时,在两点之间添加一条边
        for i in range(len(Matrix)):
            for j in range(len(Matrix)):
                if Matrix[i, j] == 1:
                  G.add_edge(i, j)

        nx.draw(G, with_labels=True)
        plt.show()



版权声明:本文为Stephen_Sun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。