最小生成树「建议收藏」

最小生成树

大家好,又见面了,我是全栈君。

记录用来复习。

—————————————————————-

PRIMER

总体思路:和Dijstrak差点儿相同,都是用了简单的贪心策略,每次挑选距离生成树距离近期的没被合并进来的点作为吸收对象。

仅仅是primer在松弛那一步上把距离的更新作为总体距离的更新而Dijstrak则是单原点的距离更新!!。

// primer.cpp : 定义控制台应用程序的入口点。

//#include "stdafx.h"#include"iostream"#include"vector"#include"algorithm"#include"queue"#include"math.h"#include"string"#include"memory.h"using namespace std;#define max 100#define inf 9999int dis[max][max]={inf};int visited[max]={0};int n=0;//和dijstrak算法一样。仅仅是角度不一样。int primer(int s){ int sum=0; visited[s]=1; for(int k=0;k<n;k++) {//initial!!! int min=inf; int mark=-1; for(int i=0;i<n;i++) { //find min if(visited[i]==0&&dis[s][i]<min) { min=dis[s][i]; mark=i; } } if(mark==-1) break; //visited visited[mark]=1; sum+=dis[s][mark];//多了一步统计 for(int j=0;j<n;j++) {//updata if(visited[j]==0&&dis[s][j]>dis[mark][j])//把dis[s][j]看成是总体到其它各点的距离!!!

这里和djs不同. dis[s][j]=dis[mark][j]; } } return sum;}int main(){ int e=0; cin>>n>>e; int tempa=0,tempb=0,value; for(int i=0;i<100;i++) for(int j=0;j<100;j++) dis[i][j]=inf; for(int i=0;i<e;i++) { //无向 cin>>tempa>>tempb>>value; tempa--; tempb--; dis[tempa][tempb]=value; dis[tempb][tempa]=value; } cout<<primer(0)<<endl; return 0;}

KRUSKAL

kruskal的思路也是贪心。

可是和上面的primer不同,kruskal主要针对边的权大小来选择吸收的点。

简单来讲能够分成下面3步:

【1】依据边的权值大小来排序。

【2】检測候选边的端点是否来自同一集合。

【3】合并点。更新并查集。

// kruskal.cpp : 定义控制台应用程序的入口点。

//#include "stdafx.h"#include"iostream"#include"algorithm"#include"vector"#include"string"#include"memory.h"#include"stdlib.h"#include"queue"using namespace std;#define max 100int node[max]={0};int e=0;class road{public: int a; int b; int value;};vector<road*> roads;bool cmp(road* r1,road* r2){ return r1->value<r2->value;}int find_set(int n){ if(node[n]==-1) return n; find_set(node[n]);}int merge(int a,int b){ if(a==b) return 0; else if(a>b) node[a]=b; else if(a<b) node[b]=a; return 1;}int kruskal(){ //sort edges sort(roads.begin(),roads.end(),cmp); int sum=0; for(int i=0;i<e;i++) { //find set int a=find_set(roads[i]->a); int b=find_set(roads[i]->b); //merge if(merge(a,b))//-1 is true!! sum+=roads[i]->value; } return sum;}int main(){ memset(node,-1,sizeof(node)); cin>>e; int a=0,b=0,value=0; for(int i=0;i<e;i++) { cin>>a>>b>>value; road *r=new road; r->a=a; r->b=b; r->value=value; roads.push_back(r); } int sum=kruskal(); cout<<sum<<endl; return 0;}

測试数据:

9
14
1 2 4
1 8 8
2 3 8
2 8 11
3 4 7
3 6 4
3 9 2
4 5 9
4 6 14
5 6 10
6 7 2
7 8 1
7 9 6
8 9 7

out:37

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116421.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java static(三) – 静态代码块

    Java static(三) – 静态代码块静态代码块static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内JVM加载类时会执行这些静态代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们每个静态代码块只会被执行一次实例说明//父类publicclassParentStatic{privatestaticStringpstr=”父类静态变量”;static{System.o.

    2022年7月16日
    14
  • linux 安装tinyxml,使用TinyXml「建议收藏」

    linux 安装tinyxml,使用TinyXml「建议收藏」使用TinyXml的两种方法。第一,导入所需的头文件和cpp文件TinyXml由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。这就是开源的好处,就跟你自己写的程序一样,想怎么用都行。…

    2022年6月11日
    230
  • PyCharm 常用设置(主题、样式、字体、字号)「建议收藏」

    PyCharm 常用设置(主题、样式、字体、字号)「建议收藏」PyCharm常用设置(主题、样式、字体、字号)点击菜单File=>Settings,打开PyCharm设置对话框点击Appearance&Behavior=>Appearance,设置IDE主题(Theme),推荐Darcula(如果PyCharm安装完成后,第一次启动时错过了设置,可以在这里做)…

    2022年8月25日
    7
  • linux中rar解压命令_tar解压zip文件

    linux中rar解压命令_tar解压zip文件例1:添加文件或目录到压缩档案中,使用a命令。例如把文件files1添加到abc.rar中,使用a或m命令,a命令把file1文件添加到abc.rar档案中保持原有的file1文件不变,m命令移动file1文件到file1.rar档案中(压缩完成后会删除原有的file1文件,注意:m命令只针对文件进行操作)$raraabc.rarfile1说明:如果此时abc.rar档案不存在,会自行创建a…

    2022年10月7日
    0
  • 大数据开发工作辛苦吗?「建议收藏」

    大数据开发工作辛苦吗?「建议收藏」大数据开发工作辛苦吗?现在的社会是一个高速发展的社会,科技发达,信息流通,人们之间的交流越来越密切,生活也越来越方便,大数据就是这个高科技时代的产物。大数据并不在“大”,而在于“有用”。价值含量、挖掘成本比数量更为重要。因此对大数据的开发和分析对一个企业来说显得尤为重要。大数据开发人才也变得炙手可热。虽然大数据相关人才很受欢迎,但是有些人担心做了大数据开发之后,加班太多,会比较辛…

    2022年5月4日
    60
  • mysql读写分离怎么实现(数据库读写分离实现)

    为什么要实现mysql读写分离大型网站为了解决大量的并发访问,除了在网站实现分布式负载均衡,远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别是数据丢失的话,后果更是不堪设想。这时候,我们会考虑如何减少数据库的连接,下面就进入我们今天的主题。​利用主从数据库来实现读写分离,从而分担主数据库的压力。在多个服…

    2022年4月17日
    180

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号