[ An Ac a Day ^_^ ] [kuangbin带你飞]专题六 最小生成树 POJ 1251 Jungle Roads

题意:

有n个点 每个点上有一些道路 求最小生成树

解释下输入格式

A n v1 w1 v2 w2

A点上有n条边 A到v1权值是w1 A到v2权值是w2

思路:

字符串处理之后跑kruskal求最小生成树

  1 /* ***********************************************
  2 Author        :Sun Yuefeng
  3 Created Time  :2016/11/9 18:26:37
  4 File Name     :tree.cpp
  5 ************************************************ */
  6 
  7 #include<cstdio>
  8 #include<iostream>
  9 #include<algorithm>
 10 #include<cmath>
 11 #include<cstring>
 12 #include<string>
 13 #include<bitset>
 14 #include<map>
 15 #include<set>
 16 #include<stack>
 17 #include<vector>
 18 #include<queue>
 19 #include<list>
 20 #define M(a,b) memset(a,b,sizeof(a))
 21 using namespace std;
 22 typedef long long ll;
 23 const int inf=0x3f3f3f3f;
 24 const int maxn=30;
 25 const int maxm=80;
 26 const int mod=1e7+7;
 27 int dx[8]= {0,0,1,-1,1,-1,1,-1};
 28 int dy[8]= {1,-1,0,0,-1,1,1,-1};
 29 
 30 int f[maxn],tol,n;
 31 
 32 struct _edge
 33 {
 34     int u,v,w;
 35     friend bool operator < (const _edge a,const _edge b)
 36     {
 37         return a.w<b.w;
 38     }
 39 }edge[maxm];
 40 
 41 void addedge(int u,int v,int w) //加边
 42 {
 43     edge[tol].u=u;
 44     edge[tol].v=v;
 45     edge[tol].w=w;
 46     tol++;
 47 }
 48 
 49 int _find(int x) //并查集
 50 {
 51     if(f[x]==-1) return x;
 52     else return f[x]=_find(f[x]);
 53 }
 54 
 55 int kruskal()
 56 {
 57     M(f,-1);
 58     sort(edge,edge+tol); //把所有的边排序
 59     int cnt=0,ans=0;
 60     int u,v,w,f1,f2;
 61     for(int i=0;i<tol;i++) //从权值最小的边开始加
 62     {
 63         u=edge[i].u;
 64         v=edge[i].v;
 65         w=edge[i].w;
 66         f1=_find(u);
 67         f2=_find(v);
 68         if(f1!=f2) //判断是否成环
 69         {
 70             ans+=w;
 71             f[f1]=f2;
 72             cnt++;
 73         }
 74         if(cnt==n-1) break;
 75     }
 76     //if(cnt<n-1) return -1; 判断图是否连通
 77     return ans;
 78 }
 79 
 80 int main()
 81 {
 82     //freopen("in.txt","r",stdin);
 83     //freopen("out.txt","w",stdout);
 84     while(scanf("%d",&n)!=EOF&&n)
 85     {
 86         tol=0;
 87         for(int i=0;i<n-1;i++)
 88         {
 89             char str[2];
 90             int num,u,v,w;
 91             scanf("%s",str);
 92             u=str[0]-'A';
 93             scanf("%d",&num);
 94             while(num--)
 95             {
 96                 scanf("%s",str);
 97                 v=str[0]-'A';
 98                 scanf("%d",&w);
 99                 addedge(u,v,w);
100             }
101         }
102         printf("%d
",kruskal());
103     }
104     return 0;
105 }
106 /*
107 
108 9
109 A 2 B 12 I 25
110 B 3 C 10 H 40 I 8
111 C 2 D 18 G 55
112 D 1 E 44
113 E 2 F 60 G 38
114 F 0
115 G 1 H 35
116 H 1 I 35
117 3
118 A 2 B 10 C 40
119 B 1 C 20
120 0
121 
122 */
原文地址:https://www.cnblogs.com/general10/p/6048144.html