kuangbin专题最小生成树
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于kuangbin专题最小生成树的主要内容,如果未能解决你的问题,请参考以下文章
[kuangbin带你飞]专题六 最小生成树 K - The Unique MST (判断最小生成树是否唯一)
[kuangbin带你飞]专题六 最小生成树 POJ 2421 Constructing Roads