整套题都没什么难度、

POJ 1251 Jungle Roads

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
const int MAXN = 210;
struct Edge
{
    int u,v,w;
    friend bool operator < (const Edge &a,const Edge &b)
    {
        return a.w < b.w;
    }
}edge[100010];
int fa[MAXN];
int M;
int Find(int x){return x == fa[x] ? x : fa[x] = Find(fa[x]);}

void kruskal(int N)
{
    for (int i = 0 ; i < MAXN ; i++) fa[i] = i;
    sort(edge,edge + M);
    int cnt = 0;
    int ret = 0;
    for (int i = 0 ; i < M ; i++)
    {
        int fu = Find(edge[i].u);
        int fv = Find(edge[i].v);
        if (fu != fv)
        {
            fa[fv] = fu;
            cnt++;
            ret += edge[i].w;
        }
        if (cnt >= N - 1) break;
    }
    printf("%d\n",ret);
}

int main()
{
    int N;
    while (scanf("%d",&N) != EOF)
    {
        if (N == 0) break;
        M = 0;
        for (int i = 0 ; i < N - 1; i++)
        {
            char op[5];
            int tot;
            scanf("%s%d",op,&tot);
            int id = op[0] - 'A';
            while (tot--)
            {
                int val;
                char tag[5];
                scanf("%s%d",tag,&val);
                edge[M].u = id;
                edge[M].v = tag[0] - 'A';
                edge[M].w = val;
                M++;
            }
        }
        kruskal(N);
    }
    return 0;
}
View Code

相关文章: