hdu-1863畅通工程 最小生成树克鲁斯卡尔算法kruskal(并查集实现)prim普利姆算法实现

本文主要是介绍hdu-1863畅通工程 最小生成树克鲁斯卡尔算法kruskal(并查集实现)prim普利姆算法实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

畅通工程

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 16994    Accepted Submission(s): 7134


Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。

Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N 
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。

Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。

Sample Input
  
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100

Sample Output
  
3 ?
初学最小生成树,感觉克鲁斯卡尔算法就是贪心与并查集的综合,

就是按照规定一个个连通支合并的过程,使最后只剩一个连通支。

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N  105
int n,m,ans,ant,u[N],v[N],w[N],p[N],r[N];
int cmp(int i,int j)//通过sort将权值排序
{return w[i]<w[j];
}
int find(int x)//并查集查找根节点
{return p[x]==x?x:p[x]=find(p[x]);}
int kruskal()
{int fx,fy,ans=0,ant=0;for(int i=1;i<=m;i++)//并查集的初始化{p[i]=i;}for(int i=1;i<=n;i++)//标记数组初始化{r[i]=i;}sort(r,r+n,cmp);for(int i=1;i<=n;i++){int t=r[i];//排序后找到权值最小的边fx=find(u[t]);//依次找权值最小边两端点的根节点fy=find(v[t]);if(fx!=fy)//若两端点不属于同一集合,权值累计+集合合并+计数(添加的边数并判断最后能否连通所有点){ans+=w[t];p[fx]=fy;ant++;}}if(ant<m-1)ans=0;return ans;}
int main()
{int count;while(scanf("%d%d",&n,&m)!=EOF&&n){for(int i=1;i<=n;i++){scanf("%d%d%d",&u[i],&v[i],&w[i]);}count=kruskal();if(count)printf("%d\n",count);else printf("?\n");}return 0;
}

prim算法:
#include<stdio.h>
#include<iostream>
using namespace std;
#define N  105
#define inf 0x3f3f3f3f
int map[N][N];
int dis[N];
int vis[N];
int n,m,a,b,t;
int sum;
int ans;
void prim(int s)
{sum=0;ans=1;for(int i=1;i<=n;i++){dis[i]=map[s][i];vis[i]=0;}dis[s]=0;vis[s]=1;int pos,min;for(int i=1;i<n;i++){min=inf;int q=0;for(int j=1;j<=n;j++){if(!vis[j]&&dis[j]<min){min=dis[j];pos=j;q=1;}}vis[pos]=1;if(q==1){ans++;sum+=dis[pos];}for(int j=1;j<=n;j++){if(!vis[j]&&dis[j]>map[pos][j]){dis[j]=map[pos][j];}}}
}
int main()
{while(scanf("%d%d",&m,&n)!=EOF&&m){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)map[i][j]=inf;for(int i=1;i<=n;i++)dis[i]=inf;for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&t);map[a][b]=map[b][a]=t;}prim(1);if(ans!=n)printf("?\n");else printf("%d\n",sum);}return 0;
}


这篇关于hdu-1863畅通工程 最小生成树克鲁斯卡尔算法kruskal(并查集实现)prim普利姆算法实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113097

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi