首页 > 代码库 > 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 }
kuangbin专题六、最小生成树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。