用户名  找回密码
 中文实名注册
查看: 94|回复: 0

图论可视化学习

[复制链接]

711

主题

398

回帖

2万

积分

管理员

积分
21384
发表于 2025-3-18 17:41:50 | 显示全部楼层 |阅读模式
[Python] 纯文本查看 复制代码
import sys
import networkx as nx
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont

class GraphVisualizer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()
        
    def init_ui(self):
        self.setWindowTitle('图论可视化学习-东台市实验中学 727 崔冷亦')
        self.setGeometry(100, 100, 800, 600)
        
        # 主布局
        main_layout = QVBoxLayout()
        
        # 输入区域
        input_group = QGroupBox('输入图的数据')
        input_layout = QVBoxLayout()
        
        self.input_text = QTextEdit()
        self.input_text.setPlaceholderText('请输入图的数据,每行表示一条边,例如:\nA B\nB C\nC A')
        input_layout.addWidget(self.input_text)
        
        self.adj_matrix_btn = QPushButton('生成邻接矩阵')
        self.adj_matrix_btn.clicked.connect(self.generate_adj_matrix)
        input_layout.addWidget(self.adj_matrix_btn)
        
        self.adj_list_btn = QPushButton('生成邻接表')
        self.adj_list_btn.clicked.connect(self.generate_adj_list)
        input_layout.addWidget(self.adj_list_btn)
        
        self.draw_graph_btn = QPushButton('绘制图形')
        self.draw_graph_btn.clicked.connect(self.draw_graph)
        input_layout.addWidget(self.draw_graph_btn)
        
        input_group.setLayout(input_layout)
        main_layout.addWidget(input_group)
        
        # 输出区域
        self.output_text = QTextEdit()
        self.output_text.setReadOnly(True)
        main_layout.addWidget(self.output_text)
        
        # 设置主窗口部件
        container = QWidget()
        container.setLayout(main_layout)
        self.setCentralWidget(container)
        
    def generate_adj_matrix(self):
        edges = self.get_edges()
        if not edges:
            return
        
        G = nx.Graph()
        G.add_edges_from(edges)
        adj_matrix = nx.adjacency_matrix(G).todense()
        
        self.output_text.clear()
        self.output_text.append('邻接矩阵:')
        self.output_text.append(str(adj_matrix))
        
    def generate_adj_list(self):
        edges = self.get_edges()
        if not edges:
            return
        
        G = nx.Graph()
        G.add_edges_from(edges)
        adj_list = nx.generate_adjlist(G)
        
        self.output_text.clear()
        self.output_text.append('邻接表:')
        for line in adj_list:
            self.output_text.append(line)
        
    def draw_graph(self):
        edges = self.get_edges()
        if not edges:
            return
        
        G = nx.Graph()
        G.add_edges_from(edges)
        
        plt.figure()
        nx.draw(G, with_labels=True, node_color='skyblue', node_size=2000, edge_color='gray', font_size=15, font_weight='bold')
        plt.show()
        
    def get_edges(self):
        input_data = self.input_text.toPlainText().strip()
        if not input_data:
            QMessageBox.warning(self, '警告', '请输入图的数据!')
            return None
        
        edges = []
        for line in input_data.split('\n'):
            nodes = line.split()
            if len(nodes) != 2:
                QMessageBox.warning(self, '警告', f'无效的边数据:{line}')
                return None
            edges.append(tuple(nodes))
        
        return edges

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = GraphVisualizer()
    window.show()
    sys.exit(app.exec_())

回复

举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

手机版|小黑屋|东台市机器人学会;盐城市极创科技有限公司 ( 苏ICP备2021035350号-1;苏ICP备2021035350号-2;苏ICP备2021035350号-3 )

GMT+8, 2025-4-13 06:00 , Processed in 0.759853 second(s), 29 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表