POJ 1251 Jungle Roads(Kruskal)

题目链接:
[[kuangbin带你飞]专题六 最小生成树 A - Jungle Roads(http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66965#problem/A)

Kruskal算法求最小生成树

POJ 1251 Jungle Roads(Kruskal)_第1张图片

题意:

求图的最小生成树,主要注意输入!!
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;
}

你可能感兴趣的:(poj,kruskal)