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

搜索与图论——Prim算法求最小生成树

在最小生成树问题里,正边和负边都没问题

朴素版prim算法 时间复杂度O(n^2)

生成树:每一次选中的t点,它和集合的距离对应的那条边,就是生成树的一条边

算法流程和dijkstra算法非常相似 

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N = 510,INF = 0x3f3f3f3f;int n,m;
int g[N][N];
int dist[N];
bool vis[N];int prim(){memset(dist,0x3f,sizeof dist);dist[1] = 0;int res = 0;for(int i = 1; i <= n; i ++ ){int t = -1;for(int j = 1; j <= n; j ++ ){if(!vis[j] && (t == -1 || dist[j] < dist[t])){t = j;}}vis[t] = true;if(dist[t] == INF) return 0;//res的更新要先于dist[t]的更新,因为如果出现负环,就可能导致dist[t]被错误更新,从而导致res的错误res += dist[t];for(int j = 1; j <= n; j ++ ){/* 与dijkstradist[j] = min(dist[j],dist[t] + g[t][j]);不同的是,prim是与g[t][j]作比较,因为dijkstra的dist[j]表示的是j与原点的最短距离,而prim算法中dist[j]表示的是j点与集合的最短距离 */dist[j] = min(dist[j],g[t][j]);}vis[t] = true;}return res;
}int main(){cin >> n >> m;memset(g, 0x3f, sizeof g);while(m -- ){int u,v,w;cin >> u >> v >> w;//无向图是特殊的有向图,建边时只要建一条从a到b的,再建一条从b到a的就可以了g[u][v] = g[v][u] = min(g[u][v],w);}int t = prim();if(!t) cout << "impossible" << endl;else cout << t << endl;return 0;
}

堆优化版prim几乎不会用到,一般直接用kruskal就可以解决。堆优化的prim对比kruskal没有明显优势,还比较难写,故此处不贴模板。

http://www.lryc.cn/news/330291.html

相关文章:

  • sqlmap基础知识
  • 读《C Primer Plus》
  • 深入理解计算机系统 家庭作业 2.66
  • 【服务端】node.js详细的配置
  • 二、CentOS基础配置(1.网络与包管理)
  • Golang基础-5
  • Mysql数据库:故障分析与配置优化
  • 常见的图像分析算法
  • 朵米3.5客服系统源码,附带系统搭建教程
  • Python 踩坑记
  • 搭建Spark单机版环境
  • 使用Flutter混淆技术保护应用隐私与数据安全
  • ClickHouse初体验
  • 在k8s中部署高可用程序实践和资源治理
  • WebView的使用与后退键处理-嵌入小程序或者 H5 页面
  • 【攻防世界】file_include (PHP伪协议+过滤器)
  • Linux 内核中PHY子系统(网络):PHY驱动
  • 【六 (1)机器学习-机器学习算法简介】
  • TCP服务端主动向客户端发送数据
  • ObjectiveC-03-XCode的使用和基础数据类型
  • YOLOv9改进策略 :主干优化 | 无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023 RIFormer
  • 원클릭으로 주류 전자상거래 플랫폼 상품 상세 데이터 수집 및 접속 시연 예제 (한국어판)
  • 2024年github开源top100中文
  • 回收站删除的文件在哪里?专业恢复方法分享(最新版)
  • 什么是工时管理软件?
  • 一文解析智慧城市,人工智能技术将成“智”理主要手段
  • SQLBolt,一个练习SQL的宝藏网站
  • TikTok防关联引流系统:全球多账号运营的终极解决方案
  • 卷积神经网络(CNN)的数学原理解析
  • 2024年华为OD机试真题-亲子游戏-Java-OD统一考试(C卷)