kruskal是求最小生成树的算法。

    首先,kruskal就是把所有边按照权值从小到大的顺序排列,这一步可以直接使用sort,然后依次考查每一条边,设w=(u,v)表示从u到v的一条边的权值为w,则有:

情况1:u和v在同一个连通分量中,则加入(u,v)后会形成环,因此不能选择。

情况2:u和v不在同一个连通分量中,那么加入(u,v)一定是最优的,为什么呢?这个可以用反证法证明一下,在这里也就不多说啦。

这里有一份kruskal的实现代码(这份代码来自kuangbin神牛,final爷哦,大家可以去他博客学习www.kuangbin.net):

代码纯手打,所以没有语法高亮等,哈哈。

const int MAXN=110;//最大节点数

const int MAXM=1e6;//最大边数

struct Edge

{

  int u,v,w;

}edge[MAXM];//用于储存边的信息,节点u和v之间的权值为w,u,v之间可以有多条边,不影响的

int father[MAXN];//并查集的应用,用于判断2个节点是否在同一个连通变量中

int tot;//记得初始化为0或1

void addedge(int u,int v,int w)

{

  edge[tot].u=u;

  edge[tot].v=v;

  edge[tot++].w=w;

}

int find_set(int x)

{

  if(father[x]==-1)

    return x;

  else

    return father[x]=find_set(father[x]);

}//路径压缩

bool cmp(Edge x,Edge y)

{

  return x.w<y.w;

}

int kruskal(int n)//传入点数,返回最小权值,若不连通,返回-1

{

  sort(edge,edge+tot,cmp);

  memset(father,-1,sizeof(father));

  int ans=0;

  int num=0;

  for(int i=0;i<tot;i++)//我就有一次错写为i<n,囧,这里是从边是0~tot-1,随机应变咯

  {

    int u=edge[i].u;

    int v=edge[i].v;

    int w=edge[i].w;

    int fau=find_set(father[u]);

    int fav=find_set(father[v]);

    if(fau!=fav)

    {

      ans+=w;

      num++;

      father[fau]=fav;//不是father[u]=v;

    }

    if(num==n-1)

      break;

  }

  if(num<n-1)

    return -1;

  else

    return ans;

}

  就到这里啦,我会继续补充的。

MST_kruskal的更多相关文章

  1. NOIP常见模板集合

    Preface 这篇博客记录的是我联赛前虽然只有两天了的打板子记录. 只求真的能给我起到些作用吧,一般按照难度排序. 而且从这篇博客开始我会用H3的标题代替H4 为了节约篇幅,以下的代码一般均以cla ...

  2. Connect the Cities(hdu3371)并查集(附测试数据)

    Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. 最小生成数 克鲁斯卡尔 普里姆 matlab

    克鲁斯卡尔: function T=MST_Kruskal(G) n=0; if isfield(G,'w') && ~isempty(G.w) && size(G.w ...

  4. Codeforces 333E Summer Earnings(bitset)

    题目链接 Summer Earnings 类似MST_Kruskal的做法,连边后sort. 然后对于每条边,依次处理下来,当发现存在三角形时即停止.(具体细节见代码) 答案即为发现三角形时当前所在边 ...

  5. 最小生成树的java实现

    文章目录 一.概念 二.算法 2.1 Prim算法 2.2 Kruskal算法 笔记来源:中国大学MOOC王道考研 一.概念 连通图:图中任意两点都是连通的,那么图被称作连通图 生成树:连通图包含全部 ...

随机推荐

  1. pthread_join和pthread_detach的用法(转)

    一:关于join join join是三种同步线程的方式之一.另外两种分别是互斥锁(mutex)和条件变量(condition variable). 调用pthread_join()将阻塞自己,一直到 ...

  2. URAL 1176 Hyperchannels(欧拉回路路径)

    Hyperchannels Time limit: 1.0 secondMemory limit: 64 MB The Galaxy Empire consists of N planets. Hyp ...

  3. 课堂所讲整理:Set和Map

    Set相关知识: package org.hanqi.array; import java.util.*; public class Test2 { public static void main(S ...

  4. Python爬虫学习笔记——豆瓣登陆(三)

    之前是不会想到登陆一个豆瓣会需要写三次博客,修改三次代码的. 本来昨天上午之前的代码用的挺好的,下午时候,我重新注册了一个号,怕豆瓣大号被封,想用小号爬,然后就开始出问题了,发现无法模拟登陆豆瓣了,开 ...

  5. 如果将彩色图像和灰度图像一起放进 CNN 中去,会是什么结果?

    如果将彩色图像和灰度图像一起放进 CNN 中去,会是什么结果? 今天,坑爹的实验,我处理 SUN397 的时候,忘记去掉灰度图了,结果,利用微调后的 model 提取 feature,悲剧的发现,无论 ...

  6. win7下安装配置tomcat,java运行环境

    转 http://www.cnblogs.com/pannysp/archive/2012/03/07/2383364.html 1.下载JDK,安装 官网下载地址:http://java.sun.c ...

  7. vs2010 无法创建 *.edmx(Entity Frame Work) 文件的问题

    当你安装了VS2010或者已经安装了EntityFramework41RC.exe之后发现依然在Add New Item时无法找到ADO.NET Entity Model,有可能是你创建的不是netf ...

  8. 螺旋矩阵 noip2014普及组

    本题可以直接模拟填数字,也可以直接计算结果. 代码一:(这个代码,缺陷在于数组太大,浪费内存啊.另外,循环次数也不少.总之,时间空间的消耗都不小.) /*======================= ...

  9. win7下MariaDB10.0的my.ini配置文件的位置

    msi版本的,安装后在安装目录下的\data\my.ini 常用的配置选项: 1.修改默认的存储引擎 在配置文件my.ini(linxu下为my.cnf) 中的 [mysqld] 下面加入defaul ...

  10. Oracle视图详解

    转载自:http://blog.itpub.net/29785807/viewspace-1270120/ 一. 视图的定义 视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本 ...