博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板 - Prim
阅读量:4681 次
发布时间:2019-06-09

本文共 1378 字,大约阅读时间需要 4 分钟。

Kruskal算法要对边排序,然后打个并查集维护,但是实际上Prim有他好玩的地方,就把Dijkstra的到点的距离从dis[v]:dis[u]+w改成边dis[v]:w。

那肯定是Prim好写一点。Prim感觉复杂度是O((n+m)logn),Kruskal是O(n+mlogm)。

#include
using namespace std;typedef long long ll;const int MAXN = 5005;int n, m, s, t;int dis[MAXN];bool vis[MAXN];vector
> G[MAXN];const int INF = 0x3f3f3f3f;priority_queue
>pq;int Prim(int s) { for(int i = 1; i <= n; ++i) dis[i] = INF; int cnt = 0, sum = 0; dis[s] = 0; pq.push({-dis[s], s}); while(!pq.empty()) { int u = pq.top().second; pq.pop(); if(vis[u]) continue; vis[u] = 1; ++cnt; sum += (dis[u]); for(auto e : G[u]) { int v = e.first, w = e.second; if(!vis[v] && w < dis[v]) { dis[v] = w; pq.push({-dis[v], v}); } } } if(cnt == n) return sum; return -1;}int main() {#ifdef Yinku freopen("Yinku.in", "r", stdin);#endif // Yinku scanf("%d%d", &n, &m); for(int i = 1; i <= m; ++i) { int u, v, w; scanf("%d%d%d", &u, &v, &w); G[u].emplace_back(v, w); G[v].emplace_back(u, w); } int res = Prim(1); if(res == -1) puts("orz"); else printf("%d\n", res); return 0;}

转载于:https://www.cnblogs.com/Yinku/p/11345565.html

你可能感兴趣的文章
Java判断密码强度工具类
查看>>
阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint1-基于Epoll架构的采集端程序框架设计\第1课-Epoll机制精通...
查看>>
jmeter(四十四)常用性能指标分析
查看>>
6个出色的基于JQuery的Tab选项卡实例2010/01/29 16:261. jQuery 选项卡界面 / 选项卡结构菜单教程...
查看>>
F - 八苦を滅した尼公 POJ - 2763 线段树LCA
查看>>
通过jQuery源码学习javascript(一)
查看>>
源码阅读经验谈-slim,darknet,labelimg,caffe(1)
查看>>
SecureCRT配色方案
查看>>
Unity3D 关于yield在collider中的使用
查看>>
spring-mvc xml文件的最基本配置
查看>>
word 新建一行文字不能左对齐
查看>>
jquery选择器
查看>>
IT公司的等级观念
查看>>
百度编辑器ueditor1.4.3配置记录
查看>>
ubuntu12.04开启Framebuffer
查看>>
【问题和解决】python中nltk与nltk_contrib的关系
查看>>
闭包的探索
查看>>
内存泄漏
查看>>
编程之美 2.12 快速寻找满足条件的两个数 解法三证明 (算法导论 第二版 2.3-7 在n个元素的集合S中找到两个和为x的元素)...
查看>>
open_basedir restriction in effect,解决php引入文件权限问题
查看>>