当前位置: 首页 > news >正文

最小生成树模板(prim,heap-prim,kruskal)

prim

出圈法,时间复杂度 O ( n 2 ) O(n^2) O(n2)

#include<iostream>
#include<vector>
using namespace std;
#define MAX_N 5000
#define inf 100000000
struct edge{int v,w;
};
vector<edge>e[MAX_N+5];
int d[MAX_N+5],vis[MAX_N+5];
int n,m;
int ans=0,cnt=0;
bool prim(int s)
{for(int i=0;i<=n;i++)d[i]=inf;d[s]=0;for(int i=1;i<=n;i++){int u=0;for(int j=1;j<=n;j++)if(!vis[j]&&d[j]<d[u])u=j;vis[u]=1;ans+=d[u];if(d[u]!=inf)cnt++;for(auto ed:e[u]){int v=ed.v,w=ed.w;if(d[v]>w)d[v]=w;}}return n==cnt;
}
int main()
{cin>>n>>m;for(int i=1,a,b,c;i<=m;i++){scanf("%d%d%d",&a,&b,&c);e[a].push_back({b,c});e[b].push_back({a,c});}if(!prim(1)){cout<<"orz"<<endl;return 0;}else{cout<<ans<<endl;return 0;}return 0;} 

heap-prim

出队法,时间复杂度 O ( m l o g m ) O(mlogm) O(mlogm)

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define MAX_N 5000
#define inf 100000000
struct edge{int v,w;
};
vector<edge>e[MAX_N+5];
int d[MAX_N+5],vis[MAX_N+5];
int n,m;
int ans=0,cnt=0;
priority_queue<pair<int,int>>q;
bool prim(int s)
{for(int i=0;i<=n;i++)d[i]=inf;d[s]=0;q.push({0,s});while(!q.empty()){int u=q.top().second;q.pop();if(vis[u])continue;vis[u]=1;ans+=d[u];cnt++;for(auto ed:e[u]){int v=ed.v,w=ed.w;if(d[v]>w){d[v]=w;q.push({-d[v],v});}}}return n==cnt;
}
int main()
{cin>>n>>m;for(int i=1,a,b,c;i<=m;i++){scanf("%d%d%d",&a,&b,&c);e[a].push_back({b,c});e[b].push_back({a,c});}if(!prim(1)){cout<<"orz"<<endl;return 0;}else{cout<<ans<<endl;return 0;}return 0;} 

kruskal

加边法,时间复杂度 O ( m l o g m ) O(mlogm) O(mlogm)

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX_N 5000
#define MAX_M 200000
#define inf 100000000
struct edge{int u,v,w;bool operator<(const edge&t){return w<t.w;}
}e[MAX_M+5];
int k=0;
int n,m;
int fa[MAX_N+5],ans,cnt;
int find(int x)
{return fa[x]==x?x:find(fa[x]);
}
bool kruskal(){sort(e+1,e+m+1);for(int i=1;i<=n;i++)fa[i]=i;for(int i=1;i<=m;i++){int x=find(e[i].u);int y=find(e[i].v);if(x!=y){fa[x]=y;ans+=e[i].w;cnt++;}}return cnt==n-1;
}
int main()
{cin>>n>>m;for(int i=1,a,b,c;i<=m;i++){scanf("%d%d%d",&a,&b,&c);e[++k]={a,b,c};}if(!kruskal()){cout<<"orz"<<endl;return 0;}else{cout<<ans<<endl;return 0;}return 0;} 
http://www.lryc.cn/news/382295.html

相关文章:

  • Centos 7 或 8配置国内yum源及epel源-1
  • 轻松解决Android复杂数据结构序列化
  • 解析PDF文件中的图片为文本
  • 微信小程序表单
  • Javascript高级程序设计(第四版)--学习记录
  • DVWA-CSRF-samesite分析
  • 代码随想录训练营Day48
  • React进阶(五):导航守卫_renderroutes
  • Python基础系列教程:从零开始学习Python
  • deepl翻译的PDF文档保护密码解除
  • LeetCode 算法:二叉树的直径 c++
  • 盘立方期货Kdj幅图指标公式源码
  • SkyWalking 极简入门
  • 本篇内容:ArkTS开发系列之事件(2.8.1触屏、键鼠、焦点事件)
  • 测试的基础知识大全【测试概念、分类、模型、流程、测试用例书写、用例设计、Bug、基础功能测试实战】
  • Power Apps
  • qt图像处理-将OpenCV的cv::Mat类型转换为QImage类型
  • 代码随想录训练营第十八天 530二叉搜索树的最小绝对差 501二叉搜索树中的众数 236二叉树的最近公共祖先
  • 微信小程序之横向列表展示
  • 无人机巡检小羊仿真
  • springboot redission 分布式锁
  • Vuex中的重要核心属性
  • Redis哨兵集群搭建
  • 网络爬虫requests库使用指南
  • VSCODE 配置C++ 与OPENCV
  • C语言小例程28/100
  • WPF文本绑定显示格式StringFormat设置-特殊格式时间日期和多数据绑定
  • Java包介绍
  • 【2024.6.21】今日科技时事:科技前沿大事件
  • LeetCode:经典题之1491、896 题解与延伸