POJ1251 Jungle Roads 最小生成树Kruskal

最小生成树Kruskal裸题
康复训练ing

值得一提地是 用getchar() 一直在RE 最后换成了cin 才A掉

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;

#define MAX_V (30)
#define MAX_E (100)
int n, tot = 0;
int first[MAX_V], nxt[MAX_E<<1], fa[MAX_V<<1];

struct edge{
	int from, to, cost;
}es[MAX_E<<1];

void init()
{
	tot = 0;
	memset(first,-1,sizeof(first));
	memset(nxt,0,sizeof(nxt));
	memset(es,0,sizeof(es));
	for(int i = 1; i <= n; ++ i)
		fa[i] = i;
}

bool cmp(edge a, edge b)
{
	return a.cost < b.cost;
}

int find(int x)
{
	int t = x;
	while(fa[x] != x)
		x = fa[x];
	while(t != fa[t])
	{
		fa[t] = x;
		t = fa[t];
	}
	return x;
}

int Kruskal()
{
	int ans = 0;
	
	sort(es+1,es+tot+1,cmp);
	
	for(int i = 1; i <= tot; ++ i)
	{
		int fu = find(es[i].from);
		int fv = find(es[i].to);
		if(fu != fv)
		{
			fa[fu] = fv;
			ans += es[i].cost;
		}
		es[i].from = es[i].to = es[i].from = 0;
	}
	return ans;
}

int main()
{
	while(scanf("%d", &n))
	{
		if(n == 0) break;
		init();
		char c, d;
		for(int i = 1; i < n; ++ i)
		{
		//	c = getchar();
		//	if(c < 'A' || c > 'Z') c = getchar();
			cin >> c;
			int m;
			scanf("%d", &m);
			int cst;
			while(m--)
			{
			//	scanf(" %c %d", &d, &cst);
				cin >> d >> cst;
				es[++tot] = (edge){(int)(c-64), (int)(d-64), cst};
			}
		}
		printf("%d\n", Kruskal());
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值