最小优先队列+prim
来源:互联网 发布:金十数据直播室 编辑:程序博客网 时间:2024/05/21 00:47
#include <iostream>#include <cstdlib>#include <queue> using namespace std;class Edge { public: int beg; int end; int val; friend bool operator<(const Edge &, const Edge &);};bool operator<(const Edge &e1, const Edge &e2) { return e1.val > e2.val; // 最小优先队列}const int MAX_N = 100; // 顶点的最大数量bool visit[MAX_N];int value[MAX_N][MAX_N];int link[MAX_N][MAX_N]; int main() { int n, m; int p, q, v; int totVisit, curVertex; int ans; Edge tmp; priority_queue<Edge> edgePQ; cin >> n >> m; // n个顶点(标号0 -- n-1,m条边) for (int i = 0; i != n; ++i) { visit[i] = false; link[i][0] = 1; } for (int i = 0; i != m; ++i) { cin >> p >> q >> v; value[p][q] = value[q][p] = v; link[p][link[p][0]++] = q; link[q][link[q][0]++] = p; } visit[0] = true; totVisit = 1; curVertex = 0; ans = 0; while (totVisit++ < n) { for (int i = 1; i != link[curVertex][0]; ++i) { if (!visit[link[curVertex][i]]) { tmp.beg = curVertex; tmp.end = link[curVertex][i]; tmp.val = value[tmp.beg][tmp.end]; edgePQ.push(tmp); } } while (!edgePQ.empty() && visit[edgePQ.top().end]) { edgePQ.pop(); } tmp = edgePQ.top(); visit[tmp.end] = true; ans += tmp.val; curVertex = tmp.end; edgePQ.pop(); } cout << ans << endl; return EXIT_SUCCESS;}
需要注意的地方就是,由于用的是STL中的priority_queue,所以要重载<操作符。并且其默认的是最大优先队列,所以
重载<操作符的时候要返回的是>的值( >= 会出错,原因我暂时不是很清楚)。
算法时间复杂度近似于O(ElgV),基本达到要求。用最小优先队列要比不用而直接每次全部点遍历地找最小的边效率高出
很多(算法导论那本书上说用斐波拉契堆实现的话运行时间可以减少到O(E + VlgV))。
- 最小优先队列+prim
- 最小生成树模板(Prim+优先队列)
- poj 1258 最小生成树 prim+优先队列
- 5253 连接的管道【最小生成树prim+优先队列】
- 最小生成树之Prim算法 优先队列版本
- 最小生成树之prim算法(优先队列优化)
- 优先队列优化prim算法
- POJ 1251 优先队列 Prim
- js实现prim+优先队列
- 图基本算法 最小生成树 Prim算法(邻接表/邻接矩阵+优先队列STL)
- HDU1102 - Constructing Roads 用优先队列优化Prim最小生成树
- hdu 1233 还是畅通工程 (最小生成树,prim,优先队列,kruskal并查集)
- 最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
- 最大最小优先队列
- 优先队列+prim(待完善)
- 还是畅通工程(Prim+优先队列)
- 利用优先队列PriorityQueue实现Prim算法
- hdu4081 最小生成树的变形,通过此题理解了什么时候不能用优先队列实现prim算法
- IE6,IE7下 float:right 后换行的问题
- Prim算法
- 如何使用SQLMap绕过WAF
- 拷贝数组的数据
- javascript101之代码运行
- 最小优先队列+prim
- HDU2526:浪漫手机
- CMake include_directories cannot open include file :'XXX'
- 统一编址与独立编址 IO端口与IO内存
- How To Read and Write XML Documents with GDataXML
- win32 获取窗口句柄的方法
- Linux引导流程
- VC下的.cpp文件变成了二进制文件的急救
- 2013蓝桥杯预赛javaA 逆波兰式