Hduoj1301【最小生成树】

#include<stdio.h>
#include<string.h> 
#include<stdlib.h>
#define MAX 100000000
int  n, f[27], m;
struct road
{
	int a, b, dis;
}r[80];
int find(int x)
{
	if(x != f[x])
	f[x] = find(f[x]);
	return f[x];
}
int merge(int x, int y)
{
	x = find(x);
	y = find(y);
	if(x != y)
	{
		f[x] = y;
		return 1;
	}
	return 0;
}
int cmp(const void *a, const void *b)
{
	return (*(struct road*)a).dis - (*(struct road*)b).dis;
}
int main()
{
	int i, j, k;
	while(scanf("%d", &n) != EOF && n)
	{
		getchar();
		char s;
		m = 0;
		for(i = 0; i < n-1; ++i)//input
		{
			scanf("%c %d", &s, &k);
			getchar();
			if(k > 0)
			{
				char c;
				for(j = 0; j < k; ++j)
				{
					int num;
					scanf("%c %d", &c, &num);
					getchar();
					r[m].a = s-65;
					r[m].b = c-65;
					r[m++].dis = num;
				}
			}
		}
		for(i = 0; i < n; ++i)
		f[i] = i;
		qsort(r, m, sizeof(r[0]), cmp);
		int ans = 0;
		j = 0;
		for(i = 0; i < m; ++i)
		{
			if(merge(r[i].a, r[i].b) == 1)
			{
				j++;
				ans += r[i].dis;
				if(j == n-1)
				break;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}


题意:给出n个城市,接下来n行每一行对应该城市所能连接的城市的个数,城市的编号以及花费,现在求能连通整个城市所需要的最小花费。

思路:算是标准的最小生成树,只要处理好字母输入和数据的保存就可以按照标准的模板进行a题。


你可能感兴趣的:(Hduoj1301【最小生成树】)