hdu 1301 Jungle Roads
2015-08-11 20:01
399 查看
本题链接:点击打开链接
本题大意:
首先输入一个n表示有n个村庄,然后是n-1行由每个村庄可到的,并且序列号在本村庄后面的各村庄的序列号及所需道路维护费,现要废弃某些道路,但保留下的道路仍可连通所有村庄并且道路维修费最小(即找出最小生成树)。
解题思路:
即使用kruskal算法,使用一结构体存放每条道路连通的两个村庄序列号,及道路维修费用,将费用从小到大排序,然后使用kruskal算法求出最小生成树及最少费用。
参考代码:
本题大意:
首先输入一个n表示有n个村庄,然后是n-1行由每个村庄可到的,并且序列号在本村庄后面的各村庄的序列号及所需道路维护费,现要废弃某些道路,但保留下的道路仍可连通所有村庄并且道路维修费最小(即找出最小生成树)。
解题思路:
即使用kruskal算法,使用一结构体存放每条道路连通的两个村庄序列号,及道路维修费用,将费用从小到大排序,然后使用kruskal算法求出最小生成树及最少费用。
参考代码:
#include<stdio.h> #include<algorithm> using namespace std; int per[30]; int n; struct node{ char start,end; int cost; }a[500]; int cmp(node a,node b) { return a.cost<b.cost; } void init() { for(int i=0;i<27;i++) per[i]=i; } int find(int x) { if(x==per[x]) return x; return per[x]=find(per[x]); } int join(node a[],int m) { int sum=0; for(int i=0;i<m;i++) { int fx=find(a[i].start-65); int fy=find(a[i].end-65); if(fx!=fy) { per[fx]=fy; sum+=a[i].cost; } } return sum; } int main() { while(scanf("%d",&n),n) { getchar(); char T; int m,k=0; for(int j=1;j<n;j++) { scanf("%c%d",&T,&m); for(int i=0;i<m;i++) { getchar(); scanf("%c%d",&a[k].end,&a[k].cost); a[k++].start=T; } getchar(); } init(); sort(a,a+k,cmp); printf("%d\n",join(a,k)); } return 0; }
相关文章推荐
- hdu3328(Flipper)经典栈类
- hdu 5372 Segment Game 2015多校联合训练赛#7 树状数组
- seajs 源码阅读笔记
- 1048. Find Coins (25)
- 修改Android studio 中svn版本
- UVA1629---Cake slicing
- UGUI Button
- 放苹果
- 使用Shell创建GitHub仓库
- KVO 其原理探究
- hdu 1229
- WaitForSingleObject函数剖析
- Android边缓冲边播放视频(ijkplayer的编译和使用)
- 两个Activity之间传递对象
- HDU 5379 Mahjong tree
- Java搭建servlet时doGet方法中文乱码问题
- 简单谈谈3D打印培训的发展和前景
- 网页编码
- C# ling总结(1)
- poj1664 放苹果 (母函数)