一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

老物了,网上的例子多的数不过来。不过我还是有必要练习一下的。

之所以看这个算法是因为最近在看颜色聚合向量时,有的论文用到了最小生成树,因此我就拿来熟悉一下。

Kruskal算法类似于连通分支算法,感觉和过去实现过的连通区域标记算法非常像。

步骤:

1.对于一个图,将图的每条边提取出来从小到大进行排序。

2.将已排序的边依次加入到新图中,如果新图中出现了环,那么就舍弃这条边。

3.不断重复第二步。

下面两个图就是kruskal算法前后的样子。

代码如下:

main.m

复制代码
 1 clear all;
 2 close all;
 3 clc;
 4 %算法导论P349的列子
 5 G=[0 4 0 0 0 0 0 8 0;
 6    4 0 8 0 0 0 0 11 0;
 7    0 8 0 7 0 4 0 0 2;
 8    0 0 7 0 9 14 0 0 0;
 9    0 0 0 9 0 10 0 0 0;
10    0 0 4 14 10 0 2 0 0;
11    0 0 0 0 0 2 0 1 6;
12    8 11 0 0 0 0 1 0 7;
13    0 0 2 0 0 0 6 7 0];
14 
15 [m n]=size(G);
16 E=[];
17 k=0;    %边的数量
18 for i=1:m
19     for j=i:n
20         if G(i,j)~=0
21             E=[E;G(i,j) i j];   %提取边,三元组存储
22             k=k+1;
23         end
24     end
25 end
26 
27 for i=k:-1:1                %按边的权重排序,小的排前面
28     for j=1:i-1
29         if E(j,1)>E(j+1,1)
30             tmp=E(j,:);
31             E(j,:)=E(j+1,:);
32             E(j+1,:)=tmp;
33         end
34     end
35 end
36 
37 A=zeros(m,n);
38 for i=1:k  
39     A(E(i,2),E(i,3))=E(i,1);
40     A(E(i,3),E(i,2))=E(i,1);
41     if huan(A)              %加入边后判断图中是否含有环
42         A(E(i,2),E(i,3))=0;
43         A(E(i,3),E(i,2))=0;
44     end
45 end
复制代码

huan.m

复制代码
 1 function re=huan(A)
 2     [m n]=size(A);
 3     while 1
 4         pre_A=A;
 5         for i=1:m
 6             du=0;       %第m个元素的度
 7             for j=1:n
 8                 if A(i,j)~=0
 9                     du=du+1;
10                 end
11             end
12             if du==1            %元素的度为1时删除这个元素,其相邻元素度减一
13                A(i,:)=0;
14                A(:,i)=0;
15             end
16         end
17         if pre_A==A     %图中没有度为1的元素则退出
18            break; 
19         end
20     end
21     
22     if sum(A(:))==0
23         re=0;
24     else
25         re=1;
26     end
27 end
复制代码

 

posted on   一杯清酒邀明月  阅读(780)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示