图论结合matlab的一些探索

图论算法详解

code by Vaew, all right reserved

Matlab图论

  • 基本概念:有向图,无向图,邻接矩阵,关联矩阵。

  • 可达矩阵Matlab实现

    %计算图的可达矩阵
    function P = dgref(A)
    n = size(A, 1);
    P = A
    %计算矩阵Bn
    for i = 2:n
    	p = p + A - i;
    end
    
    P(P ~= 0) = 1;	%将不为0的元素变为1
    P
    
  • 最短路问题

    • 通过权值矩阵进行计算

    • DIjkstra算法(边走边搜索)

      %两点间最短路的Dijkstra算法
      function [d, index1, index2] = Dijkf(a)
      % a 表示图的权值矩阵
      % d 表示所求最短路的权和
      % index1 表示标号顶点顺序
      % index2 表示标号顶点索引
      
      %参数初始化
      M = max(max(a));
      pb(1:length(a)) = 0;
      pb(1) = 1;
      index1 = 1;
      index2 = ones(1, length(a));
      d(l:length(a)) = M: d(1) = 0: temp = 1
      %更新l(v),同时记录顶点顺序和顶点索引
      
      while sum(pb) < length(a)	%重复步骤2,直到满足条件
      	tb = find(pb == 0);
      	d(tb) = min(d(tb), d(temp) + a(temo, tb));	%更新l(v)
      	tmpb = find(d(tb) == min(d(tb)));
      	temp = tb(tmpb(l));
      	pb(temp) = l;
      	index1 = [index, temp];		%记录标号顺序
      	index = index1(find(d(index1) == d(temp) - a(temp, index1)));
      	if length(index) >= 2
      		index = index(1);
      	end
      	index2(temp) = index;		%记录标号索引
      end
      d
      index1
      index2
      
    • Warshall-Floyd算法

      function [P u] = f_path(W)
      % W 表示权值矩阵
      % P 表示最短路
      % u 表示最短路的权和
      
      %初始化,步骤1
      n = length(W);
      V = W;
      m =1;
      %步骤2
      while m <= n
      	for i = 1:n
      		for j = 1:n
      			if V(i, j) > V(i, m) + V(m, j)
      				V(i, j) = V(i, m) + V(m, j);
      			end
      		end
      	end
      	m = m + 1;
      end
      u = V(1,n);
      %输出最短路的顶点
      p1 = zeros(1,n);
      k = 1;
      p1(k) = n;
      U = ones(1, n) * inf;
      kk = n;
      while kk ~= 1
      	for i = 1:n
      		U(1, i) = V(1, kk) - W(i, kk);
      		if U(1,i) = V(1, i)
      			p1(K + 1) = i;
      			kk = i;
      			k = k + 1;
      		end
      	end
      end
      k = 1;
      wrow = find(p1 ~= 0);
      for j = length(wrow):(-1):1
      	p(k) = p1(wrow(j));
      	k = k + 1;
      end
      P	
      
    • 判断图的连通性

    • 树:

      • 基本概念:割点,割边,割集,有序二元树(有方向),Huffman树(带权重)。
      • 最小生成树的Kruskal算法步骤
        • 选择边使得权重最大;
        • 根据已选择的边选择下一个边,使得边与边不成环以及权值最大
        • 重复操作
      • 最小生成树的Prim算法步骤
        • 选择一个点作为顶点;
        • 选择与前一个点连着的边,使得边与边不成环以及权值最大
        • 重复操作
    • Euler图(平面最优环游)和Hamilton图(立体最优环游)

      • Fleury算法步骤(邮递员问题)
        • 建立一个值为v0v_0v0的集合W0W_0W0,其中v0v_0v0属于V(E)V(E)V(E)
        • WiW_iWi已经选定,从E−E-E{e1,...,eie_1,...,e_ie1,...,ei}中选一条边ei+1e_{i+1}ei+1,其中
          • ei+1e_{i+1}ei+1eie_iei相邻;
          • 除非无法选择,否则ei+1e_{i+1}ei+1不是G−G-G{e1,...,eie_1,...,e_ie1,...,ei}中的边
        • 直到步骤二不能进行为止。
      • 改良图算法(旅行售货员问题)P96
    • 匹配问题

      • 基本概念:匹配,完美匹配,最大匹配;
      • 较大基数匹配算法;
      • 匈牙利算法(人员分配问题);
      • Kuhn-Munkres算法(最优分配算法);
    • 网络流问题

      • 最大流问题
        • 最大流最小割定理:流最大时,路不可增,因此分割最小。
        • Ford-Fulkerson标号算法P119
        • Dinic算法P122
  • 最小费用流问题

    • Busacker-Gowan算法
  • 图的染色

    • 顶点染色算法
    • 边染色算法
    • 全染色算法
    • 均匀全染色算法
    • 邻点可区分全染色算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值