matlab练习程序(Kruskal最小生成树)
2013-04-09 15:07
344 查看
老物了,网上的例子多的数不过来。不过我还是有必要练习一下的。
之所以看这个算法是因为最近在看颜色聚合向量时,有的论文用到了最小生成树,因此我就拿来熟悉一下。
Kruskal算法类似于连通分支算法,感觉和过去实现过的连通区域标记算法非常像。
步骤:
1.对于一个图,将图的每条边提取出来从小到大进行排序。
2.将已排序的边依次加入到新图中,如果新图中出现了环,那么就舍弃这条边。
3.不断重复第二步。
下面两个图就是kruskal算法前后的样子。
代码如下:
main.m
huan.m
之所以看这个算法是因为最近在看颜色聚合向量时,有的论文用到了最小生成树,因此我就拿来熟悉一下。
Kruskal算法类似于连通分支算法,感觉和过去实现过的连通区域标记算法非常像。
步骤:
1.对于一个图,将图的每条边提取出来从小到大进行排序。
2.将已排序的边依次加入到新图中,如果新图中出现了环,那么就舍弃这条边。
3.不断重复第二步。
下面两个图就是kruskal算法前后的样子。
代码如下:
main.m
clear all; close all; clc; %算法导论P349的列子 G=[0 4 0 0 0 0 0 8 0; 4 0 8 0 0 0 0 11 0; 0 8 0 7 0 4 0 0 2; 0 0 7 0 9 14 0 0 0; 0 0 0 9 0 10 0 0 0; 0 0 4 14 10 0 2 0 0; 0 0 0 0 0 2 0 1 6; 8 11 0 0 0 0 1 0 7; 0 0 2 0 0 0 6 7 0]; [m n]=size(G); E=[]; k=0; %边的数量 for i=1:m for j=i:n if G(i,j)~=0 E=[E;G(i,j) i j]; %提取边,三元组存储 k=k+1; end end end for i=k:-1:1 %按边的权重排序,小的排前面 for j=1:i-1 if E(j,1)>E(j+1,1) tmp=E(j,:); E(j,:)=E(j+1,:); E(j+1,:)=tmp; end end end A=zeros(m,n); for i=1:k A(E(i,2),E(i,3))=E(i,1); A(E(i,3),E(i,2))=E(i,1); if huan(A) %加入边后判断图中是否含有环 A(E(i,2),E(i,3))=0; A(E(i,3),E(i,2))=0; end end
huan.m
function re=huan(A) [m n]=size(A); while 1 pre_A=A; for i=1:m du=0; %第m个元素的度 for j=1:n if A(i,j)~=0 du=du+1; end end if du==1 %元素的度为1时删除这个元素,其相邻元素度减一 A(i,:)=0; A(:,i)=0; end end if pre_A==A %图中没有度为1的元素则退出 break; end end if sum(A(:))==0 re=0; else re=1; end end
相关文章推荐
- matlab练习程序(Prim最小生成树)
- matlab练习程序(最大流/最小割)
- poj 1258 小白算法练习 Agri-Net 最小生成树 prim kruskal
- 图结构练习——最小生成树 kruskal
- matlab练习程序(生成加密p文件)
- matlab练习程序(矩阵生成无向网络图)
- SDUT 2144 图结构练习——最小生成树 Kruskal
- matlab练习程序(线性分类器<最小二乘>)
- Matlab生成Kruskal最小生成树
- matlab练习程序(矩阵生成有向网络图)
- matlab练习程序(生成黑白网格)
- matlab练习程序(求灰度图像最大灰度,最小灰度,平均灰度)
- matlab练习程序(生成希尔伯特曲线)
- matlab练习程序(最小包围矩形)
- matlab练习程序(最小二乘多项式拟合)
- MATLAB - 练习程序,求灰度图像均值、最大、最小数值
- matlab练习程序(Ritter‘s最小包围圆)
- 标准最小生成树kruskal程序,熟记
- matlab练习程序(生成高斯图像)
- matlab练习程序(生成多维高斯分布概率密度函数)