整套题都没什么难度、
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; }