最小生成树「建议收藏」

最小生成树

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

记录用来复习。

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

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)
上一篇 2022年1月21日 下午5:00
下一篇 2022年1月21日 下午5:00


相关推荐

  • PDAF原理简介_pfc电路工作原理图

    PDAF原理简介_pfc电路工作原理图PDAF原理原理及分类原理:是在感光芯片上预留出一些规律性对称的遮蔽像素点,专门用来进行相位检测,通过像素之间的距离及变化来决定对焦的偏移量即相位差(PD值)从而实现快速对焦。SP(shieledpixel)屏蔽掉像素一般的感光区域(黑色部分),值获得一半信号。需要另外的像素屏蔽掉另一半信号,得到完整的相位差信息。SP越多,对焦越快,但信号损失越严重,目前SP密度控制在1%~3%。屏蔽掉像素一般的感光区域(黑色部分),值获得一半信号。需要另外的像素屏蔽掉另一半信号,得到完整的相位差信息。S

    2025年9月29日
    4
  • 0.83拿下 GPT-5.4 Pro,还能接龙虾用(附教程)

    0.83拿下 GPT-5.4 Pro,还能接龙虾用(附教程)

    2026年3月16日
    2
  • 测试用例要素_用例是什么

    测试用例要素_用例是什么测试用例分层每个测试用例都有1个或多个测试步骤(List[step]),每个测试步骤对应一个API请求或其他用例的引用。从上图分析,我们可以看到testsuite中包含了3个测试用例,testca

    2022年7月31日
    9
  • 无法连接服务器怎么办(原始服务器找不到目标资源)

    Tomcat启动成功访问404:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。项目右键->Properties->JavaBuildPath->Libraries->addLibraries-选择要使用的tomcat版本查看了一下Tomcat文件夹中的webapps文件夹,发现里面并没有我的项目,但是我确实是把项目部署进去了,于是我查看…

    2022年4月11日
    324
  • 解决网页文字无法选中或复制的方法_复制不了的文字

    解决网页文字无法选中或复制的方法_复制不了的文字我们在查看一些网页时会遇到不能复制的问题,或者鼠标无法选中文字,导致不能复制。这时候我们按下键盘的F12,点击console控制台,输入以下代码后回车即可vareles=document.getElementsByTagName(‘*’);for(vari=0;i<eles.length;i++){eles[i].style.userSele…

    2022年10月13日
    3
  • drools mysql_drools 介绍

    drools mysql_drools 介绍前言目前世面上中文的 KIEDROOLSWor JBOSSBRMS 的教程几乎没有 有的也只有灵灵碎碎的使用机器来翻译的 翻的不知所云 或者是基于老版本的 JBOSSGuvnor 即 5 x 的一些教程 而且这些教程都是 缺胳膊少腿 的 初学者看后不知道它到底在干吗 能干吗 能够解决自己系统中什么问题 所以笔者自己写了几个例子 把整个最新的英文版的 KIEDROOLS6 3 0 Fin

    2026年3月19日
    2

发表回复

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

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