数学建模--图论(一)

来源:互联网 发布:nike跑步软件下载 编辑:程序博客网 时间:2024/05/16 12:34

图分为有向图和无向图,其中无向图可以视为有向图的特例,因为无向图可视作两个点之间存在两条方向相反的边。
在matlab中主要使用矩阵进行图的描述,其中最常用的还是邻接矩阵和关联矩阵,这两种表示方式是等价的,只是角度不同。
这两个矩阵的具体定义网上都有很多,这里就不具体列出来,只谈谈我的理解。
邻接矩阵是一个方阵(行数=列数),矩阵的行和列的含义都是顶点。对于无向图,如果顶点vi和vj有边相连,则邻接矩阵的A(i,j)和A(i,j)都是1,反之为零;对于有向图,如果有边从顶点vi指向顶点vj,那么A(i,j)为1。
图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
图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;
原创粉丝点击