数学建模--图论(一)

图分为有向图和无向图,其中无向图可以视为有向图的特例,因为无向图可视作两个点之间存在两条方向相反的边。
在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
    end
elseif 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;
    end
else
    fprint('please input the right value of f');
end
W;
% 有向图的关联矩阵和邻接矩阵转化
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
    end
elseif 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
    end
else
    fprint('please input the right value of f');
end
W;
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_relax

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值