图论MATLAB(1)

图论基础:邻接矩阵一般用于表示两点之间能够连通,满足连通条件下为真;关联矩阵 一般用于表示V与E的关系,
V是E的起始点用flag=1表示,尾点用flag=-1表示,不连通时为假。可达矩阵表示Vi与Vj两点是否可达。
邻接矩阵与可达矩阵转换如下:
%P=A+A^2+A^3+....+A^n
%A为邻接矩阵 P为可达矩阵
function P = reach(A)
n = size(A,1);
P = A;
for i = 2 : n
    P = P + A^i;
end
P(P ~= 0) = 1;
P;
 邻接矩阵一般为n*n阶方针,关联矩阵为m*n关系,表示点与线的拓扑关系。

%A为邻接或关联矩阵 
%a=1 关联矩阵转邻接矩阵;a=0 邻接矩阵转关联矩阵
function P = reach(A,a)

if a == 0
    %需要确定关联矩阵的边
    m = sum(sum(A))/2; %无向图除以二有向图不需要
    n = size(A,1);
    P = zeros(n,m);
     k = 1;
    for i = 1:n
        for j = i:n
            if A(i,j) ~= 0
                P(i,k) = 1;
                P(j,k) = 1;%无向图为1 有向图为-1
                k = k + 1;
            end
        end
    end
elseif a == 1
    m = size(A,2);
    n = size(A,1);
    P = zeros(n,n);
    for i = 1:m
        a = find(A(:,i)~=0);
        P(a(1),a(2)) = 1;
         P(a(2),a(1)) = 1;
    end
else
    fprintf('please input the value of f')
end
P;
图论的最短路问题可用于解决管道的铺设、线路安排、厂区选址和布局、设备更新等优化问题。主要对赋权图两个互异顶点求
最短路经问题,主要由Dijkstra和Floyd算法经典解决。
%最短距离矩阵设置
%W为权值矩阵,D为最短距离矩阵
function D = shortds(W)
n = length(W);
D = W;
m = 1;
while m <= n
    for i = 1:n
        for j = 1:n
            if D(i,j) > D(i,m) + D(m,j)
                D(i,j) = D(i,m) + D(m,j);
            end
        end
    end
    m = m + 1;
end
D;
迪杰斯特拉算法(Dijstra)类似于贪心算法的思想。通过P标号与T标号的不断标记实现路径的确定。
function [d,index1,index2] = dijkstra(A)
%d 为所求最短路的权和
%index1为标号顶点顺序
%index2为标号顶点索引

M = max(max(A));%两点间最大距离
pb(1:length(A)) = 0; %T标号的点 
pb(1) = 1;%P标号初始点
index1 = 1;%标号顶点原点
index2 = ones(1,length(A));%建立标号索引
d(1:length(A)) = M;%将两点间距离最大化处理
d(1) = 0;temp = 1;%原点距离为0,中间点设为原点
while sum(pb) < length(A) %当所有点被P标号后退出循环
    tb=(find(pb == 0));%找到未被标号的点
    d(tb) = min(d(tb),d(temp)+A(temp,tb));
    %比较从中间点过到目标点的距离小还是初始点到目标点的距离小
    tmpb = find(d(tb) == min(d(tb)));%找到最短路的被标记点标号返回
    temp = tb(tmpb(1));%存在多个最小点时取第一个
    pb(temp) = 1;%对最小路径的顶点进行P消耗
    index1 = [index1,temp];%最短路线存储
    index = index1(find(d(index1) == d(temp)-A(temp,index1)));
    if length(index) >= 2
        index = index(1);%index1为中间点
    end
    index2(temp) = index;%记录标号索引
end
d
index1
index2
function a=Dijk(a)
%a(输入量)表示图的邻接矩阵
%a(输出量)表示所求最短路径的距离矩阵

%建立邻接矩阵,若不还是对称矩阵,则变为对称矩阵
n=length(a);
for i=2:n
    for j=1:(i-1)
        a(i,j)=a(j,i);
    end
end

for k=1:(n-1)
    b=[1:(k-1),(k+1):n];
    kk=length(b);
    a_id=k;
    b1=(k+1):n;
    kk1=length(b1);
    while kk>0
        for j=1:kk1
            te=a(k,a_id)+a(a_id,b1(j));
            if tek
            miid1=find(b1==a_id);
            b1=[b1(1:(miid1-1)),b1((miid1+1):kk1)];
            kk1=length(b1);    
    end
end


for j=(k+1):n
    a(j,k)=a(k,j);
end
end

你可能感兴趣的:(算法之路)