首页 > 其他分享 >图的最小生成树--小白进阶篇

图的最小生成树--小白进阶篇

时间:2023-02-17 15:06:33浏览次数:23  
标签:count int return struct -- 进阶篇 小白 const include


情景导入:

            最近同学小i ,我们姑且叫他小i同学

,他最近不知道迷上了旅游,常常在夜深人静的时候,突然仰天大笑,”明天我要做个惊天地泣鬼神的决定,我要去旅行“ ,然后市面上几乎所有的地图,百科全书啊,什么地理大勘探啊,还有各种省钱的穷游小秘籍,小i同学在女朋友的帮助下,商量了许多可以去参观的旅游城市,包括城市里的各种旅游路线,能重要的是小i有个非常贴心精明的女朋友,他女朋友将小i同学准备去的城市之间所有的路线以及花费的money都一一列出来,聪明的你一定能找到最短的路线吧!那么回归到我们怎么能用代码或者说程序来计算出最短路线呢? 

            上面就提到了最短问题,当然我们可以用Floyd-warshall 算法 Dijlstra 单源最短路等等, 今天我们来说一个图的最小生成树,那么树 作为计算机一种存储结构,它的优点很多,这里就不列举了。

            一言不合先上代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
// 最小生成树
const int INF = 0x3f3f3f3f ;
const int MAX = 12000 ;
struct edge{
int u ;
int v ;
int w ;
};
struct edge e[MAX] ;
int f[MAX];
bool cmp(const struct edge a ,const struct edge b)
{
return a.w <b.w ;
}
int Getroot(int v)
{
if(f[v]==v)
{
return v ;
}
else
{
return f[v] = Getroot(f[v]);
}


}
bool merge(int v ,int u)
{
int t1 = Getroot(v) ;
int t2 = Getroot(u) ;
if(t1!=t2)
{
f[t2] = t1 ;
return true ;
}
return false ;

}
int main()
{
int sum = 0 ;
int count = 0 ;
int n ,m ;
int i ,j ;
while(cin>>n>>m)
{
sum = 0 ;
count = 0 ;


for(i=1;i<=m;i++)
{
scanf("%d%d%d",&e[i].u ,&e[i].v ,&e[i].w);
}
sort(e+1,e+1+m,cmp) ;// 对边进行排序;
// 并查集初始化
for(i=1;i<=n;i++)
{
f[i] = i ;

}
// 核心代码
for(i=1;i<=m;i++)
{
if(merge(e[i].u ,e[i].v))
{
count++;
sum+=e[i].w;
}
if(count == n-1) // n个顶点 有n-1条边
break;
}
if(count !=n-1)
{
printf("%d\n",-1);

}
else
printf("%d\n",sum);
}

return 0 ;
}

先对各条边进行排序,按照从小到大顺序排序,我们用了STL 标准库里的sort模板函数。

每次取最小的顶点 u 与 v 看看他们之间是否连通 ,若未连通则连通,我们采用了并查集,最后将各个联通的边输出就ok了


标签:count,int,return,struct,--,进阶篇,小白,const,include
From: https://blog.51cto.com/u_15970235/6064100

相关文章

  • Drying
    #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;intconstMAX=1000;intconstINF=9999999;intn,k;//wash......
  • 堆-- 神奇的优先队列
    堆是什么?是一种特殊的完全二叉树,就像树一样。有没有发现这棵二叉树有一个特点?就是所有的父节点都比子节点小(PS:就是圆圈的数值,圆圈外面的编号是这个节点的编号,)那么符合这样......
  • 贪心-活动选择
    题目描述: ProblemDescription学校的大学生艺术中心周日将面向全校各个学院的学生社团开放,但活动中心同时只能供一个社团活动使用,并且每一个社团活动开始后都不能中断。现......
  • 基于sysbench-mongodb-lua的mongodb的性能测试
    1.环境准备installsysbenchyuminstallsysbenchinstallmongoroverdriver···yuminstalllibmongoc-devlibbson-devluarocksluarocksinstallmongorover......
  • 素数的埃式筛选法
    constintN=1e7;intprime[N];//第i个素数boolis_prime[N];intsieve(intn){intcnt=0;for(inti=0;i<=n+1;i++){is_prime[i]=true;}is_p......
  • 只有五行的算法----Floyd-Warshall
    上图为一个城市地图,图中有4个城市,8条公路,公路上的数字表示这条公路的长短,并且这些公路是单向的,我们现在要求出任意两个城市之间的最短路径,也就是求任意两点的最短路径。我......
  • 数据结构--顺序线性表
    #include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>usingnamespacestd;#defineOK1#defineERROR-1#defineLIST_INIT_SIZE100#defineLISTSIZ......
  • 数据结构--基本概念及术语
    1. 数据:是对客观事物的符号表示,在我们计算机科学中是指所有能输入到计算机中,并能够被计算机程序处理的符号总称。他是计算机程序加工的“原料”。比如说,一个利用数值分......
  • 数据结构--线性表
    线性表最简单也是最常用的一种数据结构,它的特点是,在数据元素的非空有限集中,(1)存在唯一一个被称为“第一个”的数据元素,存在唯一一个被称为“最后一个”的数据元素。(2)除了第......
  • 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第十三章 QSPI Flash读写测试实验​
    QSPIFlash读写测试实验​PS的输入/输出外设(IOP)有两个具有不同功能特性和IO接口性能的QSPI控制器。它们共享相同的APB从接口和MIO引脚。一次只能使用控制器中的一个。QSPI......