最小生成树练习1(克鲁斯卡尔算法Kruskal)

今天刷一下水题练手入门,明天继续。03061498

poj1861 Network(最小生成树)新手入门题。

题意:输出连接方案中最长的单根网线长度(必须使这个值是所有方案中最小的),然后输出方案。

题解:本题没有直接求生成树,但如果连接n个集线器的方案多于n-1条边,那么必存在回路,因此去掉某些边剩下的边和所有顶点构成一个生成树。对于一个图的最小生成树来说,它的最大边满足所有生成树的最大边里最小,正和题意。

吐槽:题目样例是错的。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=1001;
 6 struct edge{
 7     int u,v,w;
 8 }e[15001];
 9 int f[N],a[N],ai;
10 int n,m,ma;
11 int cmp(edge a,edge b){
12     return a.w<b.w;
13 }
14 void init(){
15     for(int i=1;i<=n;++i)
16         f[i]=i;
17 }
18 int fin(int x){
19     if(x!=f[x])f[x]=fin(f[x]);
20     return f[x];
21 }
22 void Kruskal(){
23     ma=ai=0;
24     int u,v,i;
25     init();
26     for(i=0;i<m;++i){
27         u=e[i].u;
28         v=e[i].v;
29         if((u=fin(u))!=(v=fin(v))){
30             f[u]=v;
31             a[ai++]=i;
32             ma=max(e[i].w,ma);
33         }
34         if(ai>=n-1)break;
35     }
36 }
37 int main(){
38     int i,u,v,w;
39     scanf("%d%d",&n,&m);
40     for(i=0;i<m;++i){
41         scanf("%d%d%d",&u,&v,&w);
42         e[i]=edge{u,v,w};
43     }
44     sort(e,e+m,cmp);
45     Kruskal();
46     printf("%d\n%d\n",ma,ai);
47     for(i=0;i<ai;++i)
48         printf("%d %d\n",e[a[i]].u,e[a[i]].v);
49     return 0;
50 }
View Code

 

poj1251 Jungle Roads(最小生成树)水题。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=27;
 6 struct edge{
 7     int u,v,w;
 8 }e[75];
 9 int f[N];
10 int n,m,ans;
11 int cmp(edge a,edge b){
12     return a.w<b.w;
13 }
14 void init(){
15     for(int i=0;i<n;++i)
16         f[i]=i;
17 }
18 int fin(int x){
19     if(x!=f[x])f[x]=fin(f[x]);
20     return f[x];
21 }
22 void Kruskal(){
23     ans=0;
24     int u,v,i;
25     init();
26     for(i=0;i<m;++i){
27         u=e[i].u;
28         v=e[i].v;
29         if((u=fin(u))!=(v=fin(v))){
30             f[u]=v;
31             ans+=e[i].w;
32         }
33     }
34 }
35 int main(){
36     int i,j,w,k;
37     char u[3],v[3];
38     while(scanf("%d",&n),n){
39         m=0;
40         for(i=0;i<n-1;++i){
41             scanf("%s %d",u,&k);
42             for(j=0;j<k;++j){
43                 scanf("%s %d",v,&w);
44                 e[m++]={u[0]-'A',v[0]-'A',w};
45             }
46         }
47         sort(e,e+m,cmp);
48         Kruskal();
49         printf("%d\n",ans);
50     }
51     return 0;
52 }
View Code

 

poj1287 Networking(最小生成树)水题。

用prim要注意两个地点之间的线路可能多条,即有重边。我这里练的是Kruskal,题目没给边数,但知道点数最多50,则边数最多50*49/2=1225条,有重边,开大点数组就行,因为数据弱,随便开个1500都过了,醉。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int M=1500;
 6 struct edge{
 7     int u,v,w;
 8 }e[M];
 9 int f[50];
10 int n,m,ans;
11 int cmp(edge a,edge b){
12     return a.w<b.w;
13 }
14 void init(){
15     for(int i=1;i<=n;++i)
16         f[i]=i;
17 }
18 int fin(int x){
19     if(x!=f[x])f[x]=fin(f[x]);
20     return f[x];
21 }
22 void Kruskal(){
23     ans=0;
24     int u,v,i;
25     init();
26     for(i=0;i<m;++i){
27         u=e[i].u;
28         v=e[i].v;
29         if((u=fin(u))!=(v=fin(v))){
30             f[u]=v;
31             ans+=e[i].w;
32         }
33     }
34 }
35 int main(){
36     int i,u,v,w;
37     while(scanf("%d",&n),n){
38         scanf("%d",&m);
39         for(i=0;i<m;++i){
40             scanf("%d%d%d",&u,&v,&w);
41             e[i]={u,v,w};
42         }
43         sort(e,e+m,cmp);
44         Kruskal();
45         printf("%d\n",ans);
46     }
47     return 0;
48 }
View Code

 

poj2031 Building a Space Station(最小生成树)题目看老久,其实挺水…空间站存在一些球形单间,如果单间之间接触,重叠或用走廊连接则连通。给出单间坐标和半径,求要使得所有单间相连通的走廊总长度的最小值。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 const int M=5000;
 7 const int N=100;
 8 struct edge{
 9     int u,v;
10     double w;
11 }e[M];
12 double a[N],b[N],c[N],r[N];
13 int f[N];
14 int n,m;
15 double ans;
16 int cmp(edge a,edge b){
17     return a.w<b.w;
18 }
19 double dist(int i,int j){
20     return sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j])+(c[i]-c[j])*(c[i]-c[j]))-r[i]-r[j];
21 }
22 void init(){
23     for(int i=0;i<n;++i) f[i]=i;
24 }
25 int fin(int x){
26     if(x!=f[x])f[x]=fin(f[x]);
27     return f[x];
28 }
29 void Kruskal(){
30     ans=0;
31     int u,v,i,cnt=0;
32     init();
33     for(i=0;cnt<n-1;++i){
34         u=e[i].u;
35         v=e[i].v;
36         if((u=fin(u))!=(v=fin(v))){
37             f[u]=v;
38             ans+=e[i].w;
39             cnt++;
40         }
41     }
42 }
43 int main(){
44     int i,j;
45     double w;
46     while(scanf("%d",&n),n){
47         for(i=0;i<n;++i){
48             scanf("%lf%lf%lf%lf",&a[i],&b[i],&c[i],&r[i]);
49         }
50         for(m=i=0;i<n-1;++i){
51             for(j=i+1;j<n;++j){
52                 w=dist(i,j);
53                 if(w<0) w=0;
54                 e[m++]={i,j,w};
55             }
56         }
57         sort(e,e+m,cmp);
58         Kruskal();
59         printf("%.3f\n",ans);
60     }
61     return 0;
62 }
View Code

 

poj2421 Constructing Roads(最小生成树)水题。有些点已经连边,进行标记,加边时将其边赋值为0即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int M=5000;
 6 const int N=101;
 7 struct edge{
 8     int u,v,w;
 9 }e[M];
10 int f[N];
11 int g[N][N],vis[N][N];
12 int n,ans;
13 int cmp(edge a,edge b){
14     return a.w<b.w;
15 }
16 void init(){
17     for(int i=1;i<=n;++i) f[i]=i;
18 }
19 int fin(int x){
20     if(x!=f[x])f[x]=fin(f[x]);
21     return f[x];
22 }
23 void Kruskal(){
24     ans=0;
25     int u,v,i,cnt=0;
26     init();
27     for(i=0;cnt<n-1;++i){
28         u=e[i].u;
29         v=e[i].v;
30         if((u=fin(u))!=(v=fin(v))){
31             f[u]=v;
32             ans+=e[i].w;
33             cnt++;
34         }
35     }
36 }
37 int main(){
38     int i,j,a,b,ei,m;
39     while(scanf("%d",&n)==1){
40         for(i=1;i<=n;++i)
41             for(j=1;j<=n;++j)
42             scanf("%d",&g[i][j]);
43         memset(vis,0,sizeof(vis));
44         scanf("%d",&m);
45         while(m--){
46             scanf("%d%d",&a,&b);
47             vis[a][b]=1;
48         }
49         ei=0;
50         for(i=1;i<n;++i){
51             for(j=i+1;j<=n;++j){
52                 if(vis[i][j]) e[ei++]={i,j,0};
53                 else  e[ei++]={i,j,g[i][j]};
54             }
55         }
56         sort(e,e+ei,cmp);
57         Kruskal();
58         printf("%d\n",ans);
59     }
60     return 0;
61 }
View Code

 

转载于:https://www.cnblogs.com/GraceSkyer/p/5774634.html

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

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

相关文章

系统测试:单元测试相关知识笔记

一、单元测试概念单元测试也成为模块测试&#xff0c;在模块编写完成且无编译错误后就可以进行。单元测试侧重模块中的内部处理逻辑和数据结构。如果采用机器测试&#xff0c;一般用白盒测试法。二、单元测试检查模块特征1、模块接口模块接口保证了测试模块数据流可以正确地流入…

跨网段远程调试vs_如何提高后台服务应用问题的排查效率?日志 VS 远程调试

转眼间&#xff0c;距离Jerry最近一篇文章推送已经过去了一个多月的时间了。公众号更新的频率降低&#xff0c;不是因为Jerry偷懒&#xff0c;而是由于从春节过后&#xff0c;我所在的SAP成都研究院数字创新空间整个团队&#xff0c;一直在忙一个5月份需要交付的项目上。Jerry每…

计算机硬件知识:BIOS、EFI与UEFI详解!

本文估计很多小白看不懂&#xff0c;但是还是建议你硬着头皮看完&#xff0c;这篇文章主要讲解了这几种“BIOS”的启动方式&#xff0c;对电脑启动问题判断的理解会有益处。BIOS是个程序&#xff0c;存储在BIOS芯片中&#xff0c;而现在的新式电脑用的基本都是UEFI启动&#xf…

在db2数据库上模拟死锁场景 还是z上的

如果条件允许&#xff0c;起两个线程互相抢资源就行了&#xff0c;但问题是&#xff0c;时间上还需要同步&#xff0c;要做到完美控制&#xff0c;还得加其他逻辑&#xff0c;忒费事&#xff0c;所以可以用下面的办法&#xff1a; 在目标表上直接加个锁……简单&#xff0c;粗暴…

项目开发基础:常用测试方法介绍

1、集成测试集成测试就是把模块按照设计说明书的要求组合起来进行测试。1.1、集成测试方法&#xff1a;a、分别测试各个模块&#xff0c;再把这些模块组合起来进行整体测试&#xff0c;也就是非增量式集成。特点&#xff1a;可以对模块进行并行测试&#xff0c;能充分利用人力&…

svd奇异值分解_NCL专辑 | 奇异值分解(SVD)

奇异值分解SVD(Singular Value Decomposition)是一种矩阵分解方法&#xff0c;在气象领域中常用来分析两个气象场场之间的关系。NCL的函数库中与SVD相关的函数包括svd_lapack&#xff0c;svdcov&#xff0c;svdcov_sv&#xff0c;svdstd&#xff0c;svdstd_sv。svd_lapack&…

项目测试基础:白盒测试相关知识笔记

1、白盒测试概念白盒测试又称为结构测试&#xff0c;主要是根据程序的内部结构和逻辑来设计测试用例&#xff0c;然后对程序的路径和过程进行测试&#xff0c;检查是否满足设计的需要。2、白盒测试常用的技术介绍白盒测试常用的技术有逻辑覆盖、循环覆盖、基本路径测试。2.1 逻…

java全局变量和局部变量

分类&#xff1a; 变量按作用范围划分分为全局变量&#xff08;成员变量&#xff09;和局部变量 成员变量按调用方式划分分为实例属性与类属性 局部变量按定义位置划分分为形参&#xff0c;方法局部变量&#xff0c;代码块局部变量 成员变量&#xff1a; 直接在类中声明的…

电脑系统知识:Windows原版系统与Ghost系统的区别,你知道吗?

经常看到有电脑小白的朋友问原版操作系统跟Ghost的区别是什么&#xff0c;该怎么选择安装哪种系统&#xff1f;今天在这里就说说它们之间的联系与区别。Windows原版系统&#xff1a;原版系统就是微软推送给用户的原始“干净”的系统。系统不含第三方的软件&#xff0c;软件补丁…

sql server update触发器_SQL Server 触发器

T-SQL 触发器触发器分为BEFORE触发器*(SQL Server不支持&#xff0c;Oracle支持)在事件发生时触发。AFTER触发器是 SQLServer生成的最初用于自动相应数据修改的机制。在 SQLServer200以前的版本中 AFTER触发器是唯一的触发器&#xff0c;因此不用指明 AFTER&#xff0c;也可以用…

iOS 公司开发者账号申请

对于独立开发者很有用,收藏起来,以备不时之需! 苹果开发者账号分三种。 个人账号&#xff1a;个人申请用于开发苹果app所使用的账号&#xff0c;仅限于个人使用&#xff0c;申请比较容易&#xff0c;$99。 公司账号&#xff1a;以公司的名义申请的开发者账号&#xff0c;用于公…

php渲染视图,Laravel 视图渲染:Blade 模板引擎

Laravel 视图渲染&#xff1a;Blade 模板引擎由 学院君 创建于3年前, 最后更新于 2年前版本号 #153378 views27 likes0 collectsBlade 简介Blade 是由 Laravel 提供的非常简单但功能强大的模板引擎&#xff0c;不同于其他流行的 PHP 模板引擎&#xff0c;Blade 在视图中并不约束…

项目管理基础:系统切换相关知识笔记

1、系统试运行主要任务对新系统进行初始化、补录各种原始数据记录记录系统运行过程中的数据和状况核对新旧系统输出结果是否正确对实际系统的输入方式进行考察主要包括是否方便、效率、可靠性、误操作保护等方面。对系统实际运行、响应速度进行实际测试&#xff0c;确定是否满足…

sql 分组统计_leetcode-sql面试题十七篇精讲合集

这可能是全网最干货的sql讲解系列文章。全系列共十七讲。做了大量的知识点的拓展&#xff0c;涵盖了sql的方方面面。欢迎关注点赞收藏&#xff0c;正在整理三年数据分析的点点滴滴。包括Excel、python、sql、power BI、各种分析模型框架。保证输出最干的干货。涉及知识点包括&a…

项目管理基础:系统维护相关知识笔记

1、系统的可维护性系统的可维护性就是项目维护人员理解、改正、改动和改进该软件的难易程度。提高系统的可维护性是开发软件吸引所有步骤的关键目的&#xff0c;系统能否被很好地维护&#xff0c;可用系统的可维护性这一指标来衡量。1.1 系统可维护性的评价指标可理解性&#x…

一个栈桢对应着一个方法

一个栈桢对应着一个方法