标签:
Description
Input
Output
Sample Input
9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0
Sample Output
216 30
题目大意:
给你n个顶点,然后每输入一个顶点,就输入与这个顶点相互链接的顶点的个数和顶点的名称,然后求在这n个顶点构成的n-1条边的最小生成树。
解题思路:
kruskal 裸题。注意怎么建图,然后跑kruskal就行了。
代码:
# include<cstdio> # include<iostream> # include<algorithm> # include<cstring> using namespace std; # define MAX 33*33 struct Edge { int u,v; int w; }edge[MAX]; int f[MAX]; int tot; int n; void init() { for ( int i = 0;i < MAX;i++ ) f[i] = i; } void addedge( int u,int v,int w ) { edge[tot].u = u; edge[tot].v = v; edge[tot++].w = w; } int cmp ( const struct Edge & a,const struct Edge & b ) { return a.w < b.w; } int getf ( int x ) { if ( f[x]==x ) return x; else { int t = getf(f[x]); f[x] = t; return f[x]; } } int kruskal() { int ans = 0, cnt = 0; sort(edge,edge+tot,cmp); for ( int i = 0;i < tot;i++ ) { int u = edge[i].u; int v = edge[i].v; int w = edge[i].w; int x = getf(u); int y = getf(v); if ( x!=y ) { f[x] = y; ans+=w; cnt++; } if ( cnt==n-1 ) break; } return ans; } int main(void) { while ( scanf("%d",&n)!=EOF ) { if( n==0 ) break; init(); for ( int i = 1;i < n;i++ ) { char s1[5];int t; scanf("%s%d",s1,&t); if ( t==0 ) continue; while ( t-- ) { char s2[5]; int tt; scanf("%s%d",s2,&tt); addedge(s1[0]-‘A‘,s2[0]-‘A‘,tt); addedge(s2[0]-‘A‘,s1[0]-‘A‘,tt); } } int ans = kruskal(); printf("%d\n",ans); memset(edge,0,sizeof(edge)); tot = 0; } return 0; }
POJ 1251 Jungle Roads(kruskal)
标签:
原文地址:http://www.cnblogs.com/wikioibai/p/4799696.html