08-图7 公路村村通

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:

输入数据包括城镇数目正整数N)和候选道路数目M);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。

输出格式:

输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出,表示需要建设更多公路。

输入样例:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3

输出样例:

12

#include<stdio.h>
#include<stdlib.h>
#define MaxSzie 10000
typedef struct line {
	int qidian;
	int zhongdian;
	int changdu;
}Line;

int getTopZ(Line *l,int *parent,int f) {
	int pA= l[f].zhongdian;
	while (parent[l[f].zhongdian] != -1)
	{
		l[f].zhongdian = parent[l[f].zhongdian];
		pA = l[f].zhongdian;
	}
	return pA;
}
int getTopQ(Line *l, int *parent, int f) {
	int pA= l[f].qidian;
	while (parent[l[f].qidian] != -1)
	{
		l[f].qidian = parent[l[f].qidian];
		pA = l[f].qidian;
	}
	return pA;
}

int main()
{
	int n, m;
	scanf("%d %d\n", &n, &m);
	int *parent = (int *)malloc(sizeof(int)*(n+1));
	for (int i = 1; i <= n; i++)
	{
		parent[i] = -1;
	}
	Line *l = (Line *)malloc(sizeof(Line)*m);
	for (int i = 0; i < m; i++)
	{
		scanf("%d %d %d", &l[i].qidian, &l[i].zhongdian, &l[i].changdu);
	}
	int Longs = 0;
	int count = 0;
	while (count<(n-1))
	{
		int min = MaxSzie;
		int f=-1;
		for (int i = 0; i < m; i++)
		{
			if (l[i].changdu < min) {
				min = l[i].changdu;
				f = i;
			}
		}
		if (f == -1) {
			break;
		}
		int pA, pB;
		pA = getTopZ(l, parent, f);
		pB=getTopQ(l, parent, f);
		if (pB != pA) {
			parent[pB]=pA;
			Longs += l[f].changdu;
			count++;
		}
		l[f].changdu = MaxSzie;
	}

	if (count==(n-1)) {
		printf("%d", Longs);
	}
	else {
		printf("-1");
	}
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_29718605/article/details/80291736