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. Java—面向对象—权限修饰符及思维导图

    课上老师所讲实例整理: package org.hanqi.pn0120; //汽车 public class Car { //颜色 private String yanse; //品牌 privat ...

  2. poj2492 带权并查集

    题意:研究一种生物,有n个生物个体,发现有一些之间进行了交配,给出了这些关系,问是否有同性恋的bug出现. 用0\1表示某元素和其祖先元素的性别关系,0 为相同,1 为不同,用 mod2 实现累计处理 ...

  3. strlen() 函数

    strlen() 函数通常用来计算字符串的长度,但是今天突然发现个奇怪的现象. 如下所示: #include <stdio.h> #include <stdlib.h> #in ...

  4. java基础之:详解内部类(转载)

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  5. 论文笔记之:Playing for Data: Ground Truth from Computer Games

    Playing for Data: Ground Truth from Computer Games ECCV 2016 Project Page:http://download.visinf.tu- ...

  6. Castle

    Castle AOP 系列(一):对类方法调用的拦截(有源码) 标签: aopAOPCastle对类方法调用的拦截 2012-11-09 16:51 4207人阅读 评论(1) 收藏 举报  分类: ...

  7. PHP包名解释

    下载地址:        http://windows.php.net/download#php-5.5 下载到的php*.zip各项文件说明: php-5.6.26-nts-Win32-VC11-x ...

  8. Advancing The Realtime Web With RethinkDB

    RethinkDB is an open-source distributed database built to store JSON and scale with very little effo ...

  9. windows系统安装MongoDB

    最近一直在学习node.js,nodejs开发指南中有一个微博的web开发项目,由于该书出的比较早(2012出的),目前为止利用nodejs进行web开发各种组合技术都发生了很大的更新,例如书中选择的 ...

  10. Kettle使用jndi mssqlserver

    kettle可以使用jdbc的方式设置job或者tansform的数据库连接,但是,同时它也支持JNDI方式连接数据库,后者更加方便,只需要配置一份配置文件就可以了,不用每个DBConnection都 ...