学习kruskal

转载 2013年12月03日 21:51:39
伪代码:

    把所有边排序,记第i小的边为e[i] (1<=i<m)

    初始化最小生成树为空

    初始化连通分量,让每一个点自成连通分量

    for(int i=0;i<m;i++)

    {

        if(e[i].u与e[i].v不在同一个连通分量)

         {

            把边e[i]加入到最小生成树中

            合并e[i].u和e[i].v所在的连通分量

         }

     }

    可用并查集优化

C++代码:

 

struct KRUSKAL
{
	const int MAXN = 109;
	const int MAXE = 5009;
 
	struct EDGE
	{
		int u, v, length, choose;
	}	edge[ MAXE ];
 
	int path[ MAXN ];
	int N, edgecnt, sum;
 
	void Addedge(int u, int v, int len)
	{
		++edgecnt;
		edge[ edgecnt ].u = u;
		edge[ edgecnt ].v = v;
		edge[ edgecnt ].length = len;
		edge[ edgecnt ].choose = false;
		return ;
	}
 
	void Set()
	{	
		for (int i = 1; i <= N; i++)
			path[i] = i;
		return ;
	}
 
	int Find_Path(int x)
	{
		if (x != path[x]) path[x] = Find_Path( path[x] );
		return path[x];
	}
 
	int Work()
	{
		int cnt = 0, x, y;
		Qsort(1, edgecnt);	// i < j -> edge[i].length < edge[j].length
		Set();
		for (int i = 1; i <= E && cnt < N - 1; i++)
		{
			x = Find_Path( edge[i].u );
			y = Find_Path( edge[i].v );
			if (x == y) continue;
			path[x] = path[y];
			edge[i].choose = true, ++cnt;
			sum += edge[i].length;
		}	
		return sum;
	}
}	Kruskal;

 

C++并查集优化代码:

 

#include <iostream>
using namespace std;
const int MAXV = 1024, MAXE = 100001;
int n, m, f[MAXV], ans, cnt;
struct edge{
	int f, t, w;
}es[MAXE];
bool cmp(const edge &a, const edge &b){
	return a.w < b.w;
}
void Fill(int &a){
	static int cnt = 0;
	a = ++cnt;
}
int get(int x){
	return x == f[x] ? x : f[x] = get(f[x]);
}
void Kruskal(const edge &e){
	if(get(e.f) != get(e.t)){
		f[get(e.f)] = get(e.t);
		ans += e.w;
		cnt++;
	}
}
void Read(edge &e){
	cin>>e.f>>e.t>>e.w;
}
int main()
{
	cin>>n>>m;
	for_each(es+1, es+m+1, Read);
	make_heap(es+1, es+m+1, cmp);
	sort_heap(es+1, es+m+1, cmp);
	for_each(f+1, f+n+1, Fill);
	for_each(es+1, es+m+1, Kruskal);
	cout<<(cnt < n-1 ? -1: ans)<<endl;
	return 0;
}



 

例题:最短网络 图论算法之最小生成树 prim//kruskal 学习笔记

图论算法之最小生成树  prim//kruskal         最小生成树简单的说就是在一个图里选取一些边,使这些边以及它们所连接的结点组成一棵树(两两结点之间可以到达),并且使选取的边的边权最小...

10-25 最小生成树——kruskal算法学习——经典例题及自编模版

---------------题目--------------- 1078 最小生成树  时间限制: 1 s  空间限制: 128000 KB ...

学习笔记--最小生成树之kruskal算法

Kruskal算法   1.概览 Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种...
  • flyljg
  • flyljg
  • 2014年08月23日 10:28
  • 720

数据结构 学习笔记(九):图(下):最小生成树(Prim,Kruskal 算法),拓扑排序 AOV,关键路径 AOE

最小生成树什么是最小生成树解决最小生成树有很多算法,但是归结起来都是贪心算法。贪心算法: 什么是“贪”:每一步都要最好的 什么是“好”:权重最小的边 但是因为是最小生成树,所以这个贪心算法还需要约束:...
  • Jurbo
  • Jurbo
  • 2017年07月10日 15:43
  • 755

ACM学习感悟——POJ1258(kruskal)

Description Farmer John has been elected mayor of his town! One of his campaign promises was to b...
  • CQUWEL
  • CQUWEL
  • 2015年04月09日 21:15
  • 168

最小生成树[Kruskal&&Prim](学习)

本文是我边学习边写下的博客,望大家一起学习,错误请指出。主要我会以代码显现些图联通的过程,如果并不能领悟,建议大家去看一些有图解析的博客吧,我们再来领略些入门题目,不断更新呗-_-。最小生成树:一个有...

ACM学习感悟——POJ3723(kruskal,并查集)

Description Windy has a country, and he wants to build an army to protect his country. He has p...
  • CQUWEL
  • CQUWEL
  • 2015年04月09日 19:23
  • 184

数据结构与算法学习之路:Prim算法和Kruskal算法

一、Prim算法和Kruskal算法是什么?

016-kruskal算法-贪心-《算法设计技巧与分析》M.H.A学习笔记

1. 对G的边按权重非降序排列。 2. 一次取权重最小的边,如果把它放入T不会形成回路的话,则把它放入T中,否则将它丢弃。...

Kruskal算法python实现

  • 2017年06月21日 20:20
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习kruskal
举报原因:
原因补充:

(最多只允许输入30个字)