HDU : 1301 (Jungle Roads)
May 16, 2011 Leave a comment
// http://acm.hdu.edu.cn/showproblem.php?pid=1301
// Runtime: 0ms
// Tag: MST, Kruskal
// @BEGIN_OF_SOURCE_CODE
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cctype>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <sstream>
#include <cmath>
#include <bitset>
#include <utility>
#include <set>
#include <numeric>
#define INF_MAX 2147483647
#define INF_MIN -2147483647
#define pi acos(-1.0)
#define N 1000
#define LL long long
#define For(i, a, b) for( int i = (a); i < (b); i++ )
#define Fors(i, sz) for( size_t i = 0; i < sz.size (); i++ )
#define Fore(it, x) for(typeof (x.begin()) it = x.begin(); it != x.end (); it++)
#define Set(a, s) memset(a, s, sizeof (a))
#define Read(r) freopen(r, "r", stdin)
#define Write(w) freopen(w, "w", stdout)
using namespace std;
int parent [30];
struct village {
int s;
int e;
int d;
} a [30];
bool cmp (village p, village q)
{
if ( p.d < q.d ) return true;
return false;
}
void reset ()
{
for ( int i = 0; i < 30; i++ ) parent [i] = i;
}
int parentOf (int n)
{
if ( n == parent [n] ) return n;
return parent [n] = parentOf (parent [n]);
}
int main ()
{
// Read ("in.in");
int vertex;
while ( scanf ("%d", &vertex ) && vertex ) {
reset ();
int ind = 0;
for ( int i = 1; i < vertex; i++ ) {
char start [3]; scanf ("%s", start);
int k; scanf ("%d", &k);
for ( int j = 0; j < k; j++ ) {
char end [3]; scanf ("%s", end);
scanf ("%d", &a [ind].d);
a [ind].s = start [0] - 'A';
a [ind].e = end [0] - 'A';
ind++;
}
}
sort (a, a + ind, cmp);
int totalCost = 0;
int selectedEdges = vertex - 1;
for ( int i = 0; i < ind && selectedEdges; i++ ) {
int p = parentOf (a [i].s);
int q = parentOf (a [i].e);
if ( p != q ) {
parent [p] = q;
selectedEdges--;
totalCost += a [i].d;
}
}
printf ("%d\n", totalCost);
}
return 0;
}
// @END_OF_SOURCE_CODE

