Jungle Roads——最小生成树
作者:互联网
题意:
把各个岛屿看成一个点,求各个岛屿之间权值最小的路径(最小生成树)
对于数据
数据输入的第一行n代表岛屿的个数,当为0时程序结束。
接着n-1行开始为岛屿的编号,用大写字母表示,接着是一个整数k,表示与该岛屿连接的岛屿个数,然后该行输入m对数据
字母表示岛屿编号 接着一个整数w表示,重修两岛屿之间的桥所需要的时间
题解:
最小生成树模板题,主要是处理数据输入和把字母编号转换为数字编号
代码:
#include<iostream> #include<stdio.h> #include<math.h> #include<algorithm> #include<vector> using namespace std; typedef long long ll; const int maxn = 30; int f[maxn]; int n,cnt; struct node { int u,v,w; bool operator < (const node &a)const { return w<a.w; } } edge[maxn*maxn]; int Find(int x) { return x==f[x]?x:f[x]=Find(f[x]); } int kruskal() { int ans=0; for(int i=0; i<=n; i++)f[i]=i; sort(edge,edge+cnt); int sum=0; for(int i=0; i<cnt; i++) { int x=edge[i].u; int y=edge[i].v; int fx=Find(x); int fy=Find(y); if(fx!=fy) { f[fx]=fy; ans+=edge[i].w; sum++; } if(sum==n-1)break; } return ans; } int main() { while(~scanf("%d",&n) && n) { cnt=0; for(int i=1; i<n; i++) { char s; cin>>s; int u=s-'A'; int k; scanf("%d",&k); while(k--) { cin>>s; int v=s-'A'; int w; scanf("%d",&w); edge[cnt].u=u; edge[cnt].v=v; edge[cnt++].w=w; } } printf("%d\n",kruskal()); } return 0; }kruskal
标签:cnt,const,int,岛屿,最小,edge,Jungle,Roads,include 来源: https://www.cnblogs.com/j666/p/11616842.html