题目链接:
[[kuangbin带你飞]专题六 最小生成树 A - Jungle Roads(http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66965#problem/A)
Kruskal算法求最小生成树
题意:
求图的最小生成树,主要注意输入!!
Kruskal算法:并查集+排序
//#include"stdafx.h"
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
struct edge
{
int s, e;
int w;
}e[100];//边集
int n;
int cnt = 0;
int p[30];//并查集
bool cmp(edge a, edge b) { return a.w < b.w;}
int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); }//找爹函数
int kruskal()
{
sort(e, e + cnt, cmp);
int ans = 0;
for (int i = 0; i < cnt; i++)
{
int x = find(e[i].s);
int y = find(e[i].e);
if (x != y)//互相不连通(爹不一样)
{
ans += e[i].w;
p[x] = y;
}
}
return ans;
}
int main()
{
while (cin >>n)
{
if (n == 0) break;
cnt = 0;
for (int i = 0; i < 30; i++) p[i] = i;
for (int i = 0; i < n-1; i++)
{//这个n-1把我坑惨了,wrong了N回!!!细心啊!
char s;
cin >> s;
int k;
cin >> k;
for (int j = 0; j < k; j++)
{
char end;
int w;
cin >> end>>w;
e[cnt].s = s - 'A';
e[cnt].e = end - 'A';
e[cnt++].w = w;
}
}
int ans = kruskal();
printf("%d\n", ans);
}
return 0;
}