2008年第3题

本文介绍了使用C语言解决特定问题的算法实现过程,包括结构定义、查找根节点、比较函数设计、输入处理、并查集操作、路径压缩、求解最短路径等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址:http://jobdu.sinaapp.com/problem.php?cid=1040&pid=74

C语言源码:

#include<stdio.h>
#include<stdlib.h>
typedef struct road
{
	int a,b,len;
}road;
road r[10000];
int T[101];
int findroot(int x)
{
	int temp;
	if(T[x]==-1)
		return x;
	else
	{
		temp=findroot(T[x]);
		T[x]=temp;
		return temp;
	}
}
int cmp(const void *a,const void *b)
{
	road *aa=(road *)a;
	road *bb=(road *)b;
	return aa->len-bb->len;
}
int main()
{
	int n,m,a,b,l,state,roota,rootb,top,i;
	scanf("%d",&n);
	while(n)
	{
		m=n*(n-1)/2;
		top=0;
		for(i=0;i<n;i++)
			T[i]=-1;
		for(i=1;i<=m;i++)
		{
			scanf("%d %d %d %d",&a,&b,&l,&state);
			a--;
			b--;
			if(state==1)
			{
				roota=findroot(a);
				rootb=findroot(b);
				if(roota!=rootb)
					T[rootb]=roota;
			}
			else
			{
				r[top].a=a;
				r[top].b=b;
				r[top].len=l;
				top++;
			}
		}
		qsort(r,top,sizeof(r[0]),cmp);
		l=0;
		for(i=0;i<top;i++)
		{
			roota=findroot(r[i].a);
			rootb=findroot(r[i].b);
			if(roota!=rootb)
			{
				l+=r[i].len;
				T[rootb]=roota;
			}
		}
		printf("%d\n",l);
		scanf("%d",&n);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值