Jungle Roads——最小生成树
Posted j666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ",kruskal()); } return 0; }
以上是关于Jungle Roads——最小生成树的主要内容,如果未能解决你的问题,请参考以下文章
HDU--1301--Jungle Roads(最小生成树)
POJ 1251 Jungle Roads (最小生成树prim)