数学建模--图论(一)
来源:互联网 发布:nike跑步软件下载 编辑:程序博客网 时间:2024/05/16 12:34
图分为有向图和无向图,其中无向图可以视为有向图的特例,因为无向图可视作两个点之间存在两条方向相反的边。
在matlab中主要使用矩阵进行图的描述,其中最常用的还是邻接矩阵和关联矩阵,这两种表示方式是等价的,只是角度不同。
这两个矩阵的具体定义网上都有很多,这里就不具体列出来,只谈谈我的理解。
邻接矩阵是一个方阵(行数=列数),矩阵的行和列的含义都是顶点。对于无向图,如果顶点vi和vj有边相连,则邻接矩阵的A(i,j)和A(i,j)都是1,反之为零;对于有向图,如果有边从顶点vi指向顶点vj,那么A(i,j)为1。
图1
如图1,是一个具有四个顶点的图,那么邻接矩阵是一个4*4的方阵
通过matlab描述该图如下
A = [0 1 1 1; 1 0 1 0; 1 1 0 1; 1 0 1 0]
可以看出,这是一个对称矩阵,这是无向图的特点。图中边e3连接顶点v3和v4,所以A(3,4)和A(4, 3)为1,其他雷同。
对于下图2的matlab描述如下
A = [0 1 1 0; 0 0 0 0; 0 1 0 1; 1 0 0 0]
关联矩阵是一个m*n的矩阵,m(行数)的含义是顶点数,n(列数)的含义是边数,相对来说,关联矩阵表达的内容更丰富,但邻接矩阵更容易通过图得到,各有优缺点。如果边ej的起点是vi,那么关联矩阵、M(i,j)为1,如果vi是ej的端点但不是起点(不是终点,之所以这样说是考虑到无向图,因为无向图虽然既是起点也是终点,但关联矩阵中不考虑边的终点,为了防止前后矛盾),那么关联矩阵、M(i,j)为-1,其他为0,当然了,对于无向图,因为一条无向边可以看作两条方向相反的有向边,所以对于ej的两个端点都看作边ej的起点,都为1。
图2
图2的关联矩阵用matlab描述如下
M = [1 0 0 0 1; -1 -1 0 0 0; 0 1 1 0 -1; 0 0 -1 1 0]
可以看出关联矩阵M的列想加起来都是0,这是因为一条边,必定有一个端点是起点,另一个点不是起点。
图1的关联矩阵用matlab描述如下
M = [1 0 0 0 1; 1 1 0 0 0; 0 1 1 0 1; 0 0 1 1 0]
附关联矩阵和邻接矩阵的转化matlab代码
function W=incandadf(G,f)% 关联矩阵和邻接矩阵的转化% G 图的相应矩阵% f=0, 邻接矩阵转化为关联矩阵% f=1,关联矩阵转化为邻接矩阵% W 转化结果if f==0 % 邻接矩阵转化为关联矩阵 m=sum(sum(G))/2; % 计算图的边数 n=size(G,1); W=zeros(n,m); k=1; for i=1:n for j=i:n if G(i,j)~=0 W(i,k)=1; % 给边的始点赋值为1 W(j,k)=1; % 给边的终点赋值为1 k=k+1; end end endelseif f==1 % 关联矩阵转化为邻接矩阵 m=size(G,2); n=size(G,1); W=zeros(n,n); for i=1:m a=find(G(:,i)~=0); %找出G第i行中等于1的位置 W(a(1),a(2))=1; % 存在边则邻接矩阵的对应值为1 W(a(2),a(1))=1; endelse fprint('please input the right value of f');endW;
% 有向图的关联矩阵和邻接矩阵转化function W=mattransf(G,f)% f=0, 邻接矩阵转化为关联矩阵% f=1,关联矩阵转化为邻接矩阵if f==0 % 邻接矩阵转化为关联矩阵 m=sum(sum(G)); n=size(G,1); W=zeros(n,m); k=1; for i=1:n for j=1:n if G(i,j)~=0 % 由i发出的边,有向边的始点 W(i,k)=1; % 关联矩阵始点值为1 W(j,k)=-1; % 关联矩阵终点值为-1 k=k+1; end end endelseif f==1 % 关联矩阵转化为邻接矩阵 m=size(G,2); n=size(G,1); W=zeros(n,n); for i=1:m a=find(G(:,i)~=0); % 找出G第i行中等于1和-1的位置 if G(a(1),i)==1 W(a(1),a(2))=1; % 有向边由a(1)指向a(2) else W(a(2),a(1))=1; % 有向边由a(2)指向a(1) end endelse fprint('please input the right value of f');endW;
- 数学建模--图论(一)
- 数学建模总结(一)
- 数学建模算法总结(一)
- 数学建模基础理论【一】(不定积分)
- 数学建模(一)线性规划问题
- 数学建模一周年纪念
- 【数学建模】数学建模(一)——数学模型概述
- 数学建模(1)
- 数学建模高级方法(一):关联分析apriori
- 数学建模算法 一 简述(1)蒙特卡洛算法
- 数学建模算法 一 简述(3)规划模型-线性规划
- 数学建模算法与应用(一)线性规划
- 数学建模建模建模
- 数学建模(7)---建模开始
- [数学建模]马氏链模型(一)基本介绍
- 数学建模实录(1)
- 数学建模实录(2)
- 数学建模实录(3)
- 解决Error inflating class android.support.design.widget.FloatingActionButton
- 分析知识,解决问题,设计方案
- Codeforces 241D : Numbers
- Springboot单元测试和Jdbctemplate的使用
- hdu5517 二维线段树
- 数学建模--图论(一)
- Django和Flask这两个框架在设计上各方面
- 使用JS打任意行金字塔练习
- javaweb项目从svn检出变成java项目
- Vivado的安装程序没反应怎么办
- 原生js遮罩层
- js获取url中的中文参数出现乱码解决方法
- 指针变量为什么可以作为“数组名”?
- 区域特性