题目[jungle Roads]: http://ac.jobdu.com/problem.php?pid=1154
思路:没什么特别,就是简单的kruskal算法实现,重点在数据的处理转换。
疑惑:实现的时候要读入单个字符,使用scanf(“%c”)总是出错,最后想到的解决办法是按字符串读入,再取其0位字符。 应该有正规的格式,暂时还没搜到!
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxSize 100
using namespace std;
int tree[30]; //村子的根节点
struct Road {
int a, b;
int len;
}road[maxSize];
int findRoot(int x) {//寻根
if (-1 == tree[x]) return x;
else {
int temp = findRoot(tree[x]);
tree[x] = temp;
return temp;
}
}
bool cmp(Road ra, Road rb) {//比较
return ra.len < rb.len;
}
int main() {
int n;//村子数
while (scanf("%d", &n) != EOF) {
if (0 == n) break;
for (int i = 1; i <= n; i++) {//初始化
tree[i] = -1;
}
int rnum = 0; //路的条数
for (int i = 1; i < n; i++) {//输入[注:是n-1行]
char str_1[5];
int myNum, temp_len;
scanf("%s", str_1);
scanf("%d", &myNum);
for (int j = 1; j <= myNum; j++) {
char str_2[5];
scanf("%s", str_2);
scanf("%d", &temp_len);
road[++rnum].a = str_1[0] - 'A' + 1;
road[rnum].b = str_2[0] - 'A' + 1;
road[rnum].len = temp_len;
}//for-j
}//for-i
sort(road + 1, road + rnum + 1, cmp);//小心序号
int sum = 0;
for (int i = 1; i <= rnum; i++) {
int a = findRoot(road[i].a);
int b = findRoot(road[i].b);
if (a != b) {
tree[a] = b;
sum += road[i].len;
}
}
printf("%d\n", sum);
}//while
return 0;
}