【模板】prim的heap优化

简单的代码。。

时间复杂度为O((n + m)logn)

大部分情况下还是跑不过kruskal的,慎用。

 1 #include <cstdio>
 2 #include <queue>
 3 #include <cstring>
 4 #define heap pair<int, int>
 5
 6 using namespace std;
 7
 8 int n, m, cnt, ans;
 9 int head[5001], to[400001], next[400001], val[400001];
10 bool vis[5001];
11 priority_queue <heap, vector <heap>, greater <heap> > q;
12
13 inline void add(int x, int y, int z)
14 {
15     to[cnt] = y;
16     val[cnt] = z;
17     next[cnt] = head[x];
18     head[x] = cnt++;
19 }
20
21 inline void queue_prim()
22 {
23     int i, u, v, tot = n;
24     heap x;
25     q.push(make_pair(0, 1));
26     while(!q.empty() && tot)
27     {
28         x = q.top();
29         q.pop();
30         u = x.second;
31         if(vis[u]) continue;
32         vis[u] = 1;
33         ans += x.first;
34         tot--;
35         for(i = head[u]; i != -1; i = next[i])
36         {
37             v = to[i];
38             if(!vis[v]) q.push(make_pair(val[i], v));
39         }
40     }
41 }
42
43 int main()
44 {
45     int i, x, y, z;
46     memset(head, -1, sizeof(head));
47     scanf("%d %d", &n, &m);
48     for(i = 1; i <= m; i++)
49     {
50         scanf("%d %d %d", &x, &y, &z);
51         add(x, y, z);
52         add(y, x, z);
53     }
54     queue_prim();
55     printf("%d", ans);
56     return 0;
57 }

时间: 2024-10-05 17:22:32

【模板】prim的heap优化的相关文章

Dijkstra的heap优化

为了将最小费用最大流的spfa优化,决定将spfa换成heap优化的Dijkstra. 所以还得现学... stl大法好. --附带码 1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 #define Heap pair<int, int> 5 6 using namespace std; 7 8 const int INF = 2147483647; 9 int n, m, t, c

poj 1258 Agri-Net 最小生成树 prim算法+heap不完全优化

Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41230   Accepted: 16810 Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He nee

hdu 2844 Coins 多重背包模板题 ,二进制优化。据说是楼教主的男人八题之一

Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8052    Accepted Submission(s): 3291 Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One

poj 1258 Agri-Net prim模板 prim与dijkstra的区别

很裸地求最小生成树的题目.题意就不多说了,最重要的就是记录一下学会了prim算法. 初学prim,给我的第一感觉就是和dijkstra好像啊,感觉两者的区别还是有的: 1:prim是求最小生成树的算法. dijkstra是求最短路的算法. 2:prim中dis保存的是未加入集合的点,加入集合需要的代价,而中的代价是其他变量保存的. dijkstra中dis保存的是从起点到当前点所花费的最小代价. 1 #include <cstdio> 2 #include <cstring> 3

hiho一下 第二十九周 最小生成树三&#183;堆优化的Prim算法【14年寒假弄了好长时间没搞懂的prim优化:prim算法+堆优化 】

题目1 : 最小生成树三·堆优化的Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生了一个疑问,究竟这样的算法在稀疏图上比Prim优化之处在哪里呢? 提示:没有无缘无故的优化! 输入 每个测试点(输入文件)有且仅有一组测试数据. 在一组测试数据中: 第1行为2个整数N.M,表示小Hi拥有的城市数量和小Hi筛选出路线的条数. 接下来的M行,每行描述一条路线,其中第i行为3个整数N1_

关于Prim的堆优化

Prim的算法的具体思路是从某个点开始用贪心的策略向外扩展,找到离当前生成树最近的节点加入树中,并用该节点更新生成树到其他节点的距离.显然复杂度O(n^2),而且有一个二倍的常数(一共扩展n次,每次找最近的点是O(n)的,用该点更新其它点在稠密图时也是O(n)的). 然后某些大佬就想到可以用堆维护当前生成树到各个节点的距离,然而其实这并不会快多少. 首先我们假设是个稠密图(稀疏图尽量用kruskal),一共有n个节点要加入生成树中,每个节点加入时又要更新生成树到与之相连的点的距离,我们只是在找离

最短路模板[spfa][dijkstra+堆优化][floyd]

借bzoj1624练了一下模板(虽然正解只是floyd) spfa: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> #include <queue> using namespace std; const int INF=100001; const int maxm=10001,maxn=10

最小生成树(模板 prim)

Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表, 表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( 1< N < 100 ):随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号

prim优先级队列优化

#include<cstdio> #include<queue> #include<cstring> using namespace std; struct my{ int next; int v; int w; }; struct lmjer{ int x,w; bool operator<(const lmjer &rhs)const{ return w>rhs.w; } }; const int nil=0x7f7f7f7f; const in