MST_kruskal
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的更多相关文章
- NOIP常见模板集合
Preface 这篇博客记录的是我联赛前虽然只有两天了的打板子记录. 只求真的能给我起到些作用吧,一般按照难度排序. 而且从这篇博客开始我会用H3的标题代替H4 为了节约篇幅,以下的代码一般均以cla ...
- Connect the Cities(hdu3371)并查集(附测试数据)
Connect the Cities Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 最小生成数 克鲁斯卡尔 普里姆 matlab
克鲁斯卡尔: function T=MST_Kruskal(G) n=0; if isfield(G,'w') && ~isempty(G.w) && size(G.w ...
- Codeforces 333E Summer Earnings(bitset)
题目链接 Summer Earnings 类似MST_Kruskal的做法,连边后sort. 然后对于每条边,依次处理下来,当发现存在三角形时即停止.(具体细节见代码) 答案即为发现三角形时当前所在边 ...
- 最小生成树的java实现
文章目录 一.概念 二.算法 2.1 Prim算法 2.2 Kruskal算法 笔记来源:中国大学MOOC王道考研 一.概念 连通图:图中任意两点都是连通的,那么图被称作连通图 生成树:连通图包含全部 ...
随机推荐
- UVa 1585 Score --- 水题
题目大意:给出一个由O和X组成的串(长度为1-80),统计得分. 每个O的分数为目前连续出现的O的个数,例如,OOXXOXXOOO的得分为1+2+0+0+1+0+0+1+2+3 解题思路:用一个变量t ...
- HDU5934 Bomb(2016杭州CCPC第二题)(强连通缩点)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1507 Uncle Tom's Inherited Land*(二分图匹配)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- memory CPU cache books
http://www.amazon.com/Consistency-Coherence-Synthesis-Lectures-Architecture/dp/1608455645/ref=pd_sim ...
- 数据库事务隔离级ORACLE数据库事务隔离级别介绍
本文系转载,原文地址:http://singo107.iteye.com/blog/1175084 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committ ...
- docker镜像、容器
第一部分:Docker镜像的基本知识 1.1 什么是Docker镜像 从整体的角度来讲,一个完整的Docker镜像可以支撑一个Docker容器的运行,在 Docker容器运行过程中主要提供文件系统视角 ...
- ROW_NUMBER、RANK、DENSE_RANK的用法
--NND,索性把2005的一起帖出来. ROW_NUMBER.RANK.DENSE_RANK的用法 (爱新觉罗.毓华 -- 广东深圳) SQL Server 引入几个新的排序(排名)函数,如ROW_ ...
- rsync+inotify-tools文件实时同步
rsync+inotify-tools文件实时同步案例 全量备份 Linux下Rsync+sersync实现数据实时同步完成. 增量备份 纯粹的使用rsync做单向同步时,rsync的守护进程是运行在 ...
- Maven最佳实践:版本管理
什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...
- C#实现数字字符串左补齐0的3种方法
int n = 3; string s = n.ToString().PadLeft(4, '0'); //0003 s = string.Format("{0:d4}", n); ...