MATLAB 图论

· · 个人记录

生成每个顶点 v_i 的形式

s = cellstr(strcat('v',int2str([1:x]'])));

邻接矩阵构建流程

构建全零矩阵

a = zeros(x) % x 代表点数

构建矩阵

无向图:上三角矩阵。

赋值语法:

a(x , y) = z;

其中可用

a(x , [y1:y2]) = z;

(x,y1) \sim (x,y2) 赋值为 z

构造图

无向图:

G = graph(a , s , 'Upper');

s 为顶点名字符串集合,'Upper' 指上三角矩阵。

有向图:

G = digraph(a , s);

plot 函数的用法

h = plot(G);                    % 绘制图 G
h = plot(G, 'Parameter1', Value1, 'Parameter2', Value2, ...);  % 自定义参数

(1) 节点样式(Node Appearance)

参数 说明 示例值
'NodeColor' 节点颜色 'r' (红), [0, 0.5, 0] (深绿), '#FF8800' (十六进制)
'Marker' 节点形状 'o' (圆圈, 默认), 's' (方形), '^' (三角形)
'MarkerSize' 节点大小 6 (默认), 10
'NodeLabel' 节点标签 G.Nodes.Name (节点名称), {} (隐藏标签)
'NodeFontSize' 标签字体大小 12
'NodeFontWeight' 标签字体粗细 'normal', 'bold'

示例

plot(G, 'NodeColor', 'k', 'Marker', 's', 'MarkerSize', 8);

(2) 边样式(Edge Appearance)

参数 说明 示例值
'EdgeColor' 边颜色 'b' (蓝), 'none' (透明)
'LineWidth' 边宽度 0.5 (默认), 2
'LineStyle' 边线型 '-' (实线), '--' (虚线), ':' (点线)
'ArrowSize' 有向图箭头大小 7 (默认), 15
'EdgeLabel' 边标签(如权重) G.Edges.Weight
'EdgeFontSize' 边标签字体大小 10

示例

plot(G, 'EdgeColor', 'r', 'LineWidth', 1.5, 'ArrowSize', 12);

(3) 图的布局(Layout)

参数 说明 示例值
'Layout' 节点排列方式 'auto' (默认), 'force', 'circle', 'layered'
'XData', 'YData' 自定义节点坐标 向量(长度 = 节点数)
'ZData' 3D 图的 z 坐标 需配合 'Layout', 'force3'

布局类型说明

示例

plot(G, 'Layout', 'circle');       % 环形布局
plot(DG, 'Layout', 'layered');     % 有向图分层布局

(4) 标签和标题

参数 说明 示例值
'NodeLabel' 节点标签 G.Nodes.Name, {} (隐藏)
'EdgeLabel' 边标签 G.Edges.Weight
'Interpreter' 标签解释器 'none' (默认), 'latex' (支持 LaTeX)

示例

plot(G, 'NodeLabel', {}, 'EdgeLabel', G.Edges.Weight);  % 只显示边权重

(5) 高亮特定节点或边

通过 highlight 函数动态修改样式:

h = plot(G);
highlight(h, [1, 2], 'NodeColor', 'r');          % 高亮节点 1 和 2
highlight(h, [1, 2], [2, 3], 'EdgeColor', 'g'); % 高亮边 (1,2) 和 (2,3)

figure 函数作用:

开一个新窗口,让新图不和原来的叠在一起。

边权展示形式:

'EdgeLabel',G.Edges.Weight

单源最短路

P = shortestpath(G,s,t)
[P,d] = shortestpath(G,s,t)
[P,d,edgepath] = shortestpath(G,s,t)

G:输入图,可以是 graph(无向图)或 digraph(有向图)对象

s:起始节点

t:目标节点

P:从节点s到节点t的最短路径节点序列

d:最短路径的总长度/权重

edgepath:最短路径中的边的索引序列

可选参数

[P,d] = shortestpath(G,s,t,'Method',algorithm)

'unweighted':广度优先搜索,适用于无权图

'positive':Dijkstra算法,适用于所有边权重为正的图

'mixed':Bellman-Ford算法,适用于含负权边但无负权环的图