【HDU - 1301】Jungle Roads(并查集+最小生成树)(内附最小生成树两种算法 克鲁斯特尔算法amp;amp;普里姆算法)

题干:

Jungle Roads
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5505    Accepted Submission(s): 3976
Problem Description

gif

The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to maintain. The Council of Elders must choose to stop maintaining some roads. The map above on the left shows all the roads in use now and the cost in aacms per month to maintain them. Of course there needs to be some way to get between all the villages on maintained roads, even if the route is not as short as before. The Chief Elder would like to tell the Council of Elders what would be the smallest amount they could spend in aacms per month to maintain roads that would connect all the villages. The villages are labeled A through I in the maps above. The map on the right shows the roads that could be maintained most cheaply, for 216 aacms per month. Your task is to write a program that will solve such problems. 


The input consists of one to 100 data sets, followed by a final line containing only 0. Each data set starts with a line containing only a number n, which is the number of villages, 1 < n < 27, and the villages are labeled with the first n letters of the alphabet, capitalized. Each data set is completed with n-1 lines that start with village labels in alphabetical order. There is no line for the last village. Each line for a village starts with the village label followed by a number, k, of roads from this village to villages with labels later in the alphabet. If k is greater than 0, the line continues with data for each of the k roads. The data for each road is the village label for the other end of the road followed by the monthly maintenance cost in aacms for the road. Maintenance costs will be positive integers less than 100. All data fields in the row are separated by single blanks. The road network will always allow travel between all the villages. The network will never have more than 75 roads. No village will have more than 15 roads going to other villages (before or after in the alphabet). In the sample input below, the first data set goes with the map above. 

 

The output is one integer per line for each data set: the minimum cost in aacms per month to maintain a road system that connect all the villages. Caution: A brute force solution that examines every possible set of roads will not finish within the one minute time limit. 

 

Sample Input
9
A  2  B  12  I  25
B  3  C  10  H  40  I  8
C  2  D  18  G  55
D  1  E  44
E  2  F  60  G  38
F  0
G  1  H  35
H  1  I  35
3
A  2  B  10  C  40
B  1  C  20
0
 


Sample Output
216

30

解题报告:

            最小生成树再来一发。

ac代码:

#include<cstdio>
#include<algorithm>
#include<iostream> using namespace std;
struct Node {int u,v;int w;bool operator< ( const  Node & b) const{return w<b.w;}
} node[105];int f[100],n,cur,cnt,ans;
void init() {cnt = 0;cur = 0;ans = 0;for (int i = 0; i <= 27; i++) {f[i] = i;  }
}
int getf(int u) {return u==f[u] ? u : f[u]=getf(f[u]);
}
void merge(int u,int v) {int t1,t2;t1=getf(u);t2=getf(v);if(t1!=t2) f[t2]=t1;
}
void input() {char ch[5];int a;for (int i = 1; i <= n - 1; i++) {scanf("%s %d", ch, &a);int u = ch[0] - 'A' + 1;for (int j = 1; j <= a; j++)  {int b;scanf(" %s %d", ch, &b);int v = ch[0] - 'A' + 1;node[cnt].u = u;node[cnt].v = v;node[cnt].w = b; cnt++;}}   
}int main() {while (scanf("%d", &n) ) {getchar();//如果不用getchar 那input中就用%s别用%c if (n==0) break;init();input();sort(node,node+cnt);for(int i = 0; i<cnt; i++) {if(getf(node[i].u) != getf(node[i].v) ) {merge(node[i].u,node[i].v);ans+=node[i].w;cur++;}if(cur==n-1) {break;}}printf("%d\n", ans);}return 0;
}

贴克鲁斯特尔算法ac代码:(常用!ac代码1就是用此法)

//hdu-1301-Jungle Roads(克鲁斯卡尔)
//题目大意:给出个村庄之间的道路及其维修费;从中选取一些路使道路的维修费最小且保证各村庄 
//之间道路畅通;
//解题思路:
//本题最核心的还是构图,由于输入的村庄用字母代替这就需要在构图中将字母替换成数字依次给每个村庄编号;
//需要注意的由于输入的有字符型数据,这就要加一些 getchar()来吸收掉中间的换行空格啥的;
//初始化 per[n] 数组一定要注意,把所有村庄都初始化就行啦; 
//具体如下: 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int per[30];
int n,m;
struct fun{           //定义结构体数组road[100],用来存放起点、终点和距离 int s;int e;int p;
}road[100];
int cmp(fun x,fun y)
{return x.p < y.p;
}
void init()           //初始化 per 数组 ;注意初始完 n个村庄即可; 
{int d;for(d=1;d < = n;d++)per[d]=d;
}
int find(int x)
{int r=x;while(r!=per[r])r=per[r];return r;	
}
bool link(int x,int y)
{int fx=find(x),fy=find(y);if(fx!=fy){per[fx]=fy;return true;}return false;
}
int main()
{int j,k,l,sum,i,cnt,a1,a2;char str1,str2;while(scanf("%d",&n)&&(n!=0)){getchar();memset(road,0,sizeof(road));memset(per,0,sizeof(per));init();for(i=1,cnt=1;i < n;i++)         //输入数据,并构图; {scanf("%c%d",&str1,&m);for(j=1;j<=m;j++){getchar();scanf("%c%d",&str2,&l);road[cnt].s=str1-'A'+1;  //将字母编号转化为数字编号并存入结构体数组中 road[cnt].e=str2-'A'+1;road[cnt].p=l;cnt++;}getchar();}                               //构图完成,剩下的就是克鲁斯卡尔啦; sort(road,road+cnt,cmp);sum=0;for(j=1;j<=cnt;j++){if(link(road[j].s,road[j].e))sum+=road[j].p;}printf("%d\n",sum);}return 0;
}

贴Prim算法ac代码:

//hdu-1301(普里姆算法)
//本题用普里姆算法求最小生成树直接用普里姆的思想构造函数即可;
//需要注意的是本题再输入数据的是时候要先对 map[1000][1000]中的前 n*n
//个元素初始化为 一个与 min相同或大于它的数;例如,0xfffffff即可;
//(n是结点的个数,由于需要在 n*n 大小的矩阵中构图,所以初始化 n*n 就行);
//为什么要对 map数组初始化呢?一是由于在prim函数中 map要对s[1000]数组赋初值;如果不对map初始化;
//那么,s[]数组中没有数据的就一直为零,与下面的 min比较时,min是永远大于它们的;这样得到的min就一直为零
//最终导致sum为零;还有,不对map按上述初始化,在更新时候也无法完成 ; 
#include<stdio.h>
#include<string.h>
#define N 0xfffff
int map[1000][1000];
int n,m,sum,cnt;
void input()
{char c1,c2;int i,j,x,y,price;cnt=0;for(i=1;i<=n;i++)      //对 map数组初始化为 N ;{for(j=1;j<=n;j++)map[i][j]=N;}for(i=1;i<n;i++)       //输入数据,并构图; {scanf("%c%d",&c1,&m);x=c1-'A'+1;for(j=1;j<=m;j++){getchar();scanf("%c%d",&c2,&price);y=c2-'A'+1;map[x][y]=map[y][x]=price;}getchar();}	
}
void prim()                 //普里姆; 
{int i,j,k,min,v,a,l;int s[1000],vis[1000];memset(vis,0,sizeof(vis));for(i=1;i<=n;i++)         s[i]=map[1][i];     //初始化 s 数组; s[1]=0;              //本身到本身的距离为零 vis[1]=1;            //标记第一个点; sum=0;for(v=1;v<n;v++){min=N;k=1;for(j=1;j<=n;j++)if(!vis[j]&&min>s[j]){min=s[j];           //寻找当前最小权值; k=j;}vis[k]=1;             //标记顶点k,表示k已连上树; sum+=min;             //将当前最小权值累加到sum中; for(a=1;a<=n;a++){if(!vis[a]&&s[a]>map[k][a])  //标记当前最小权值的顶点后,更新s[] 数组中的权值 ; s[a]=map[k][a];}}printf("%d\n",sum);
}
int main()
{char c1,c2;int i,j,x,y,price;while(scanf("%d",&n)&&(n!=0)){getchar();input();prim();}return 0;
}

 

总结:

      有的时候用%s读字符,不是因为别的,就是因为好处理空格,回车这些烦人的东西!!这件事情告诉我们,少用%c多用%s,少用char多用char[ ] !!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode中怎样格式化js代码_[VSCode插件推荐] Bracket Pair Colorizer: 为代码中的括号添上一抹亮色...

在代码编写过程中&#xff0c;各种括号 {[()]} 必不可少。然而&#xff0c;随着代码量的增加&#xff0c;你有没有因为括号的嵌套太多&#xff0c;而导致代码难以阅读&#xff1f;我们来看看下面的代码&#xff0c;在第三行代码的最后部分&#xff0c;连续出现了5个右括号&…

Asp.net MVC 从ftp服务器读取文件保存到网站本地

1 FTP连接辅助类 /// <summary>/// FTP操作单元/// </summary>public class TFTPOperationUnit{/// <summary>/// ftp地址/// </summary>private string FFTPUrl;/// <summary>/// ftp用户名/// </summary>string FFTPUserName;/// <s…

多帧点云数据拼接合并_自动驾驶:Lidar 3D传感器点云数据和2D图像数据的融合标注...

自动驾驶汽车的发展已经见证了硬件传感器记录感官数据的容量和准确度的发展。传感器的数量增加了&#xff0c;新一代传感器正在记录更高的分辨率和更准确的测量结果。 在本文中&#xff0c;我们将探讨传感器融合如何在涉及环环相扣的数据标记过程中实现更高程度的自动化。所有自…

*【HDU - 1506】【POJ - 2559】Largest Rectangle in a Histogram(单调栈或动态规划)

题干&#xff1a; Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consist…

pdf转图片记录

1 winform将pdf转图片&#xff0c;有案例&#xff0c;连接为&#xff1a;https://download.csdn.net/download/mingjing941018/20216747 2 Asp.net MVC将pdf转图片 使用Nuget安装包安装Freespire.pdf&#xff0c;控制器中相关代码&#xff1a; /// <summary>/// 将本地…

【基础知识】大数据组件HBase简述

HBase是一个开源的、面向列&#xff08;Column-Oriented&#xff09;、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系统。 只是面向列&#xff0c;不是列式存储 mysql vs hbase vs clickhouse HMaster …

改变定时器获取传感器频度_广东梅州梅县压力传感器*校对

广东梅州梅县压力传感器*校对看门狗寄存器不会改变或改变不大&#xff0c;如果看门狗寄存器发生了改变或改变很大&#xff0c;则说明系统陷入“死循环”.需要进行出错处理。在工业应用中&#xff0c;严重的干扰有时会破坏中断方式控制字&#xff0c;关闭中断&#xff0c;造成看…

**【POJ - 2389】 Bull Math (高精度乘法)

题干&#xff1a; Bulls are so much better at math than the cows. They can multiply huge integers together and get perfectly precise answers ... or so they say. Farmer John wonders if their answers are correct. Help him check the bulls answers. Read in two …

nodeType的类型

1&#xff1a;元素节点   2&#xff1a;属性节点   3&#xff1a;文本节点   4&#xff1a;CDATA区段   5&#xff1a;实体应用元素   6&#xff1a;实体   7&#xff1a;表示处理指令   8&#xff1a;注释节点   9&#xff1a;最外层的Root element,包括所有其…

springboot 不响应字段为空_面试官扎心一问:Tomcat 在 SpringBoot 中是如何启动的?...

作者&#xff1a;木木匠 http://my.oschina.net/luozhou/blog/3088908前言我们知道 SpringBoot 给我们带来了一个全新的开发体验&#xff0c;我们可以直接把 web 程序达成 jar 包&#xff0c;直接启动&#xff0c;这就得益于 SpringBoot 内置了容器&#xff0c;可以直接启动&am…

【POJ - 3250 】Bad Hair Day (单调栈)

题干&#xff1a; Some of Farmer Johns N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows heads. Each cow i has a s…

a1708硬盘转接口_资讯:希捷上架新款银河Exos系列机械硬盘,15000转+SAS协议

今日最新消息&#xff0c;希捷上架一款新品希捷银河Exos系列机械硬盘。据悉这款硬盘采用了SAS协议&#xff0c;转速高达15000RPM&#xff0c;目前公布的售价600GB为1899元RMB。据官方介绍这款希捷银河Exos系列机械硬盘为2.5英寸&#xff0c;15mm的厚度&#xff0c;最高的转速可…

ACM中关于计算几何(浮点数)的精度问题

计算几何的精度问题说到底其实是浮点数的精度问题&#xff0c;但我觉得“计算几何”比“浮点数”更能吸引眼球&#xff0c;所以选了这个标题。 1.浮点数为啥会有精度问题&#xff1a; 浮点数(以C/C为准)&#xff0c;一般用的较多的是float, double。 占字节数 数值范围 十进…

微信公众号网站开发相关记录

1 如何监听微信录音是否正常开启 wx.startRecord({success: function (ret) {alert("开始录音" JSON.stringify(ret));},fail: function (err) {alert("无法录音" JSON.stringify(err));}});

【POJ - 1182】 食物链(附超详细讲解)(并查集--种类并查集经典题)

题干&#xff1a; 动物王国中有三类动物A,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。A吃B&#xff0c; B吃C&#xff0c;C吃A。 现有N个动物&#xff0c;以1&#xff0d;N编号。每个动物都是A,B,C中的一种&#xff0c;但是我们并不知道它到底是哪一种。 有人用两…

腐蚀单机怎么进_暖气片堵塞是什么原因?要怎么解决呢?

你知道散热器到底为什么堵塞吗&#xff1f;散热器堵塞了怎么办&#xff1f;下面和金旗舰散热器小编一起来看看吧~一、散热器堵塞怎么办首先&#xff0c;把进回水阀先全部关闭&#xff0c;用扳手将散热器的堵头轻轻拧开。这里需要注意的是&#xff0c;堵头对应的散热器下面要放一…

layui弹出界面空白页问题

弹出界面时&#xff0c;有时会出现空白界面&#xff0c;应该如何处理&#xff1f; 1 尝试解决方式&#xff1a;在open方法的success回调方法中&#xff0c;获取当前iframe高度&#xff0c;重新赋予新的高度&#xff1b; let ifr layero.find(iframe)[0]; let bHeight ifr.s…

vspy如何在图形面板显示报文_设备实时状态监控:如何进行工业生产设备数据采集?...

设备实时状态监控&#xff1a;如何进行工业生产设备数据采集&#xff1f;数据采集(DAQ)&#xff0c;是指从传感器和其它待测设备等模拟和数字被测单元中自动采集非电量或者电量信号,送到上位机中进行分析&#xff0c;处理。慧都设备数据采集系统解决方案工业生产设备数据采集是…

【POJ - 2236】Wireless Network (并查集)

题干&#xff1a; An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computers, but an unexpected aftershock attacked, all computers in the network were all broken. The computers …

如何使用微信公众平台测试号进行系统开发

申请一个测试号&#xff1a;入口修改测试公众号自定义菜单&#xff08;使用微信公众平台接口调试工具&#xff09;网站开发&#xff0c;进行部署网站测试