关闭

[算法导论读书笔记]Kruskal算法

1208人阅读 评论(0) 收藏 举报

算法思想:

    把n个顶点看成看成n棵分离的树(每棵树只有一个顶点),每次选取可连接两个分离树中权值最小的边把两个分离的树合成一个新的树取代原来的两个分离树,如果重复n-1步后便得到最小生成树。


    Kruskal算法适合于稀疏图,如果用邻接矩阵来表示图,那么按边的权重排序也不好实现。

伪代码:


代码示例:

#include <stdio.h>
#include <stdlib.h>

const int MAXN = 100;

typedef struct
{
	int x, y;
	int w;
}edge;

edge e[MAXN];
//并查集相关
int p[MAXN];
int rank[MAXN];
int sum;

int cmp(const void *a, const void *b)
{
	if((*(edge*)a).w == (*(edge*)b).w)
	{
		return (*(edge*)a).x - (*(edge*)b).x;
	}
	return ((*(edge*)a).w - (*(edge*)b).w);
}
void make_set(int x)
{
	p[x] = x;
	rank[x] = 0;
}
int find_set(int x)
{
	if(x == p[x])
	{
		return x;
	}
	
	p[x] = find_set(p[x]);
	return p[x];
}

void union_set(int x, int y, int w)
{
	if( x == y )
	{
		return;
	}
	if( rank[x] > rank[y] )
	{
		p[y] = x;	
	}
	else
	{
		p[x] = y;
		if(rank[x] == rank[y])
		{
			rank[y]++;
		}
	}
	sum += w;
}

int main(int argc, char* argv[])
{
	int i, n;
	int x, y;	
	char chx, chy;
	scanf("%d", &n);
	getchar();
	
	for( i = 0; i < MAXN; i++)
	{
		make_set(i);
	}
	for(i = 0; i < n; i++)
	{
		scanf("%c %c %d", &chx, &chy, &e[i].w);
		getchar();
		e[i].x = chx - 'A';
		e[i].y = chy - 'A';
//		make_set(i);
	}

	qsort(e, n, sizeof(edge), cmp);
	sum = 0;
	for(i = 0; i < n; i++)
	{
		x = find_set(e[i].x);
		y = find_set(e[i].y);

		if(x != y)
		{
			printf("%c - %c : %d\n", e[i].x + 'A', e[i].y + 'A', e[i].w);
			union_set(x, y, e[i].w);
		}
	}
	printf("Total:%d\n", sum);
	return 0;
}


测试结果:



参考资料:

http://net.pku.edu.cn/~course/cs101/2007/resource/Intro2Algorithm/book6/chap24.htm

http://www.slyar.com/blog/kruskal-disjoint-sets-c.html

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:708263次
    • 积分:7753
    • 等级:
    • 排名:第2681名
    • 原创:135篇
    • 转载:35篇
    • 译文:7篇
    • 评论:119条
    声明
    本博客乃学习笔记,没有纯粹无意义的转载。作者除了对自己负责,不对任何读者负责。欢迎指出文章错误,如果原意交朋友,可以通过Gmail联系我(mingxinglai#gmail.com),博客基本不再更新,欢迎访问我的独立博客http://mingxinglai.com
    文章分类
    最新评论