HDU 1879 继续畅通工程

Kruskal算法实现最小生成树
本文介绍了一个使用Kruskal算法解决最小生成树问题的C语言程序实例。该程序通过读取输入文件中的边及其权重,采用并查集进行边的合并,最终输出最小生成树的总权重。
/*
http://acm.hdu.edu.cn/showproblem.php?pid=1879
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct edge{
	int a,b,c,f; //a,b 是边的两个顶点 c 是费用 f 表示是否建路 
}edge;

edge tree[110*110/2];
int pa[110];
int n,m,sum;
int cmp(const void*a, const void*b)
{
	return ((edge*)a)->c-((edge*)b)->c;
}

int find(int x)
{
	int px=pa[x];
	while(px!=x)
	{
		x=px;
		px=pa[x];
	}
	return px;
}

void merge(int x, int y)
{
	int px=find(x);
	int py=find(y);
	if(px!=py)
		pa[px] = py;
}

void kruskal()
{
	int i;
	for(i=0; i<m; i++)
	{
		if(find(tree[i].a)!=find(tree[i].b))
		{
			merge(tree[i].a,tree[i].b);
			tree[i].f=1;
			sum+=tree[i].c;
		}		
	}
} 

int main()
{
	freopen("input.txt","r",stdin);
	while(scanf("%d",&n)&&n)
	{
		m = n*(n-1)/2;
		sum=0;
		int i;
		memset(tree,0,sizeof(tree));
		for(i=1; i<=n; i++) pa[i]=i;
		for(i=0; i<m; i++)
		{
			scanf("%d %d %d %d",&tree[i].a,&tree[i].b,&tree[i].c,&tree[i].f);
			if(tree[i].f) tree[i].c=0; //预处理 使已经建路的 费用为0			
		}
		qsort(tree,m,sizeof(tree[0]),cmp);
		kruskal();
		printf("%d\n",sum);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值