标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 23882 | Accepted: 11193 |
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
【分析】话不多说,又是最小生成树,直接套模板。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include<functional> #define mod 1000000007 #define inf 0x3f3f3f3f #define pi acos(-1.0) using namespace std; typedef long long ll; const int N=1005; const int M=15005; struct Edg { int v,u; int w; } edg[M]; bool cmp(Edg g,Edg h) { return g.w<h.w; } int n,m,maxn,cnt; int parent[N]; void init() { for(int i=0; i<n; i++)parent[i]=i; } void Build() { int w,k; char u,v; for(int i=0; i<n-1; i++) { cin>>u>>k; while(k--) { cin>>v>>w; edg[++cnt].u=u-‘A‘; edg[cnt].v=v-‘A‘; edg[cnt].w=w; } } sort(edg,edg+cnt+1,cmp); } int Find(int x) { if(parent[x] != x) parent[x] = Find(parent[x]); return parent[x]; }//查找并返回节点x所属集合的根节点 void Union(int x,int y) { x = Find(x); y = Find(y); if(x == y) return; parent[y] = x; }//将两个不同集合的元素进行合并 void Kruskal() { int sum=0; int num=0; int u,v; for(int i=0; i<=cnt; i++) { u=edg[i].u; v=edg[i].v; if(Find(u)!=Find(v)) { sum+=edg[i].w; num++; Union(u,v); } //printf("!!!%d %d\n",num,sum); if(num>=n-1) { printf("%d\n",sum); break; } } } int main() { while(~scanf("%d",&n)&&n) { cnt=-1; init(); Build(); Kruskal(); } return 0; }
POJ1861 Jungle Roads(Kruskal)(并查集)
标签:
原文地址:http://www.cnblogs.com/jianrenfang/p/5728863.html