首页 > 代码库 > kuangbin专题六、最小生成树

kuangbin专题六、最小生成树

技术分享

题意:给你一个无向图,每个点都是大写字母,让你计算最小生成树的权值

ps:%c最好别用,%s才是最好的选择,大写字母转化成对应的序列位置可以 -‘A‘+1

然后fa[maxn]要初始化,edges[maxn*maxn]的大小要maxn*maxn,还要按边权排个序...

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int n;
 8 int fa[27];
 9 struct Edge{
10     char u,v;
11     int w;
12 }edges[27*27];
13 
14 bool cmp(Edge a,Edge b)
15 {
16     return a.w<b.w;
17 }
18 int find(int x)   //找到x的爸爸
19 {
20     if(fa[x]!=x)fa[x]=find(fa[x]);
21     return fa[x];
22 }
23 
24 int main()
25 {
26     while(~scanf("%d",&n) && n)
27     {
28         int m,cnt=0;
29         char x[3],y[3];
30         int d;
31         for(int i=1;i<=n;i++)
32             fa[i]=i;           //初始化
33         for(int i=1;i<n;i++)
34         {
35             scanf("%s%d",&x,&m);
36             for(int j=0;j<m;j++)
37             {
38                 scanf("%s%d",&y,&d);   //存图
39                 edges[cnt].u=x[0]-A+1;
40                 edges[cnt].v=y[0]-A+1;
41                 edges[cnt++].w=d;
42             }
43         }
44         sort(edges,edges+cnt,cmp);  //按边权排序,从小到大
45         int ans=0;
46         for(int i=0;i<cnt;i++)
47         {
48             int x=find(edges[i].u);
49             int y=find(edges[i].v);
50             if(x!=y)
51             {
52                 ans+=edges[i].w;
53                 fa[x]=y;
54             }
55         }
56         cout<<ans<<endl;
57     }
58     return 0;
59 }
View Code

 

kuangbin专题六、最小生成树