Kruskal最小生成树

%% matlab练习程序(Kruskal最小生成树)
% Kruskal算法类似于连通分支算法,感觉和过去实现过的连通区域标记算法非常像。
% 步骤:
% 1.对于一个图,将图的每条边提取出来从小到大进行排序。
% 2.将已排序的边依次加入到新图中,如果新图中出现了环,那么就舍弃这条边。
% 3.不断重复第二步。
% 下面两个图就是kruskal算法前后的样子。

注释:图中红色为最小生成树

clc;
clear all;
close all;

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];

[tempw] = find(G ~= 0);
g = G(tempw);
k = length(g);
[tempb,tempa] = find(G~=0);
e = [tempb,tempa];
[wa,wb] = sort(g);
E = [wa,e(wb,:)];
%% 生成树构造
A= zeros(size(G));
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

%% 绘图
[x,y] = cylinder(1,length(G(1,:)));
plot(x(1,:),y(1,:),‘r*‘,‘markersize‘,10,‘linewidth‘,1);
hold on 
for i = 1:length(G(1,:))
temp = [‘v‘,int2str(i)];
text(x(1,i) +0.1,y(1,i),temp);
end
for i = 1:length(e(:,1))
plot(x(1,e(i,:)),y(1,e(i,:)),‘b‘,‘linewidth‘,1)
end
hold on 
%绘制最小生成树
[tmpa,tmpb]=find(A ~= 0);
e = [tmpa,tmpb];
[nE,mE] = size(e);
for i = 1:nE
plot(x(1,e(i,:)),y(1,e(i,:)),‘r‘,‘linewidth‘,2);
end

function re = huan(A)

[m,n] = size(A);

  while 1

    pre_A = A;

    for i = 1:m

      du = 0

      for j = 1:n

        if A(i,j) ~ = 0

         du = du +1; 

        end

      end  

    if du == 1
      A(i,:) = 0;
      A(:,i) = 0;
     end

    end

    if pre_A == A

      break;
    end

  end

  if sum(A(:)) == 0
    re = 0;
  else
    re =1;
  end

end

http://www.cnblogs.com/tiandsp/category/348031.html

时间: 2024-10-09 05:34:01

Kruskal最小生成树的相关文章

Prim和Kruskal最小生成树

标题: Prim和Kruskal最小生成树时 限: 2000 ms内存限制: 15000 K总时限: 3000 ms描述: 给出一个矩阵,要求以矩阵方式单步输出生成过程.要求先输出Prim生成过程,再输出Kruskal,每个矩阵输出后换行.注意,题中矩阵表示无向图输入: 结点数矩阵输出: Prim:矩阵输出 Kruskal:矩阵输出输入样例: 3 0 1 3 1 0 2 3 2 0 输出样例: 3 0 1 3 1 0 2 3 2 0Prim: 0 0 0 0 0 0 0 0 0 0 1 0 1

贪心算法(2)-Kruskal最小生成树

什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最小生成树其实是最小权重生成树的简称.生成树的权重是考虑到了生成树的每条边的权重的总和. 最小生成树有几条边? 最小生成树有(V – 1)条边,其中V是给定的图的顶点数量. Kruskal算法 下面是步骤寻找MST使用Kruskal算法 1 1,按照所有边的权重

[算法系列之二十七]Kruskal最小生成树算法

简介 求最小生成树一共有两种算法,一个是就是本文所说的Kruskal算法,另一个就是Prime算法.在详细讲解Kruskal最小生成树算法之前,让我们先回顾一下什么是最小生成树. 我们有一个带权值的图,我们要求找到一个所有生成树中具有最小权值的生成树.如下图所示,T是图G的生成树.但不是具有最小权值的生成树. 我们可以把他们想象成一组岛屿和连接它们的可能的桥梁.当然修桥是非常昂贵和费时的,所以我们必须要知道建设什么样的桥梁去连接各个岛.不过有一个重要的问题,建设这样一组连接所有岛屿的桥梁的最低价

Kruskal 最小生成树算法

对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小. 因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为生成树(Spanning Tree),因为它生成了图 G.显然,由于树 T 连接了所有的顶点,所以树 T 有 V - 1 条边.一张图 G 可以有很多棵生成树,而把确定权值最小的树 T 的问题称为最小生成树问题(Minimum Spanning Tree).术语 "最小生成树" 实际上是

HDU 1233 prim kruskal最小生成树模板题

A - 还是畅通工程 Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试

hdu1875 畅通工程再续 并查集+kruskal最小生成树

Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米.当然,为了节省资金,只要求实现任意2个小岛之间有路通即可.其中桥的价格为 100元/米.

vijos P1234口袋的天空(Kruskal)(最小生成树)

P1234口袋的天空 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把一些云朵连在一起,做成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 格式 输入格式 每组测试数据的 第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10) 接下来M个数每行三个数

CSP 地铁修建 Kruskal (最小生成树+并查集)

问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通枢纽之间最多只有一条候选的隧道,没有隧道两端连接着同一个交通枢纽. 现在有n家隧道施工的公司,每段候选的隧道只能由一个公司施工,每家公司施工需要的天数一致.而每家公司最多只能修建一条候选隧道.所有公司同时开始施工. 作为项目负责人,你获得了候选隧道的信息,现在你可以按自己的想法选择一部分隧道进行施工

poj 3723 Kruskal最小生成树

题意: 一堆男女加进一个组,每人的加入费用是10000元.男女之间存在一种亲密度,在加入一个人的时候,ta的加入费是10000减去已经入组的异性中和亲密度最大的.问以某种顺序入组,的最小总费用是多少? 思路: 主要是把这些亲密关系看做无向图,然后要以最小的代价包含所有人,显然是最小生成树.我的做法是,先把有亲密关系的那些人建立无向图,然后求出最小生成树.剩下的人入组费统一10000元. 知识补充: 一个没有圈的连通的无向图就是树,树的边数为顶点数减一.一个没有圈的不连通的无向图就是森林,森林是有