POJ1251-Jungle Roads

题目:http://poj.org/problem?id=1251

分析:kruskal算法。因为节点,是字符所以开map做并查集,效果同数组。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <map>
 5 using namespace std;
 6 map<char,char>f;
 7 char u,v;
 8 int n,k,w,cnt,tot,ans;
 9 struct edge
10 {
11     char u,v;
12     int w;
13 }e[1100];
14 char find(char k)
15 {
16     if(f[k]==k)return k;
17     return f[k]=find(f[k]);
18 }
19 int cmp(edge a,edge b)
20 {
21     return a.w<b.w;
22 }
23 void add(char u,char v,int w)
24 {
25     e[++cnt].u=u;
26     e[cnt].v=v;
27     e[cnt].w=w;
28 }
29 int main(void)
30 {
31     while(cin>>n&&n)
32     {
33         ans=tot=cnt=0;
34         for(int i=1;i<=n-1;i++)
35         {
36             cin>>u>>k;
37             f[u]=u;
38             for(int i=1;i<=k;i++)
39             {
40                 cin>>v>>w;
41                 f[v]=v;
42                 add(u,v,w);
43             }
44         }
45         sort(e+1,e+1+cnt,cmp);
46         for(int i=1;i<=cnt;i++)
47         {
48             char fu=find(e[i].u),fv=find(e[i].v);
49             if(fu==fv)continue;
50             f[fu]=fv;
51             ans+=e[i].w;
52             if(++tot==n-1)break;
53         }
54         cout<<ans<<endl;
55     }
56     return 0;
57 }

猜你喜欢

转载自www.cnblogs.com/yanying7/p/12691556.html