最小生成树--九度1154[Kruskal]

来源:互联网 发布:外交官拉杆箱 知乎 编辑:程序博客网 时间:2024/05/22 23:14

题目[jungle Roads]: http://ac.jobdu.com/problem.php?pid=1154

思路:没什么特别,就是简单的kruskal算法实现,重点在数据的处理转换。

疑惑:实现的时候要读入单个字符,使用scanf(“%c”)总是出错,最后想到的解决办法是按字符串读入,再取其0位字符。 应该有正规的格式,暂时还没搜到!


#include<cstdio>#include<algorithm>#include<cmath>#define maxSize 100using 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;}
0 0
原创粉丝点击