hihoCoder #1109 最小生成树之堆优化的Prim算法

原题地址:http://hihocoder.com/problemset/problem/1109

#1109 : 最小生成树三·堆优化的Prim算法

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生了一个疑问,究竟这样的算法在稀疏图上比Prim优化之处在哪里呢?

提示:没有无缘无故的优化!

输入

每个测试点(输入文件)有且仅有一组测试数据。

在一组测试数据中:

第1行为2个整数N、M,表示小Hi拥有的城市数量和小Hi筛选出路线的条数。

接下来的M行,每行描述一条路线,其中第i行为3个整数N1_i, N2_i, V_i,分别表示这条路线的两个端点和在这条路线上建造道路的费用。

对于100%的数据,满足N<=10^5, M<=10^6,于任意i满足1<=N1_i, N2_i<=N, N1_i≠N2_i, 1<=V_i<=10^3.

对于100%的数据,满足一定存在一种方案,使得任意两座城市都可以互相到达。

输出

对于每组测试数据,输出1个整数Ans,表示为了使任意两座城市都可以通过所建造的道路互相到达至少需要的建造费用。

样例输入

5 29

1 2 674

2 3 249

3 4 672

4 5 933

1 2 788

3 4 147

2 4 504

3 4 38

1 3 65

3 5 6

1 5 865

1 3 590

1 4 682

2 4 227

2 4 636

1 4 312

1 3 143

2 5 158

2 3 516

3 5 102

1 5 605

1 4 99

4 5 224

2 4 198

3 5 894

1 5 845

3 4 7

2 4 14

1 4 185

样例输出

92

 1 #include <cstdio>
 2 #include <string.h>
 3 #include <queue>
 4 #include <vector>
 5 #include <algorithm>
 6 using namespace std;
 7 const int N = 1e5+1e4, M = 2e6+2e5, INF = 0x3f3f3f3f;
 8 int u[M], v[M], w[M], Next[M], first[N];
 9 struct cmp{
10     bool operator () (const int a, const int b) const{
11         return w[a] > w[b];
12     }
13 };
14 int Prim(int n)
15 {
16     priority_queue<int, vector<int>, cmp> pq;
17     bool vis[N] = {0};
18     int x, sum = 0;
19     vis[0] = true;
20     for(int i=first[0]; ~i; i=Next[i])
21         pq.push(i);
22     for(int i=1; i<n; )
23     {
24         x = pq.top();
25         pq.pop();
26         if(vis[v[x]])
27             continue;
28         vis[v[x]] = true;
29         ++i;
30         sum += w[x];
31         for(int j=first[v[x]]; ~j; j=Next[j])
32             if(!vis[v[j]])
33                 pq.push(j);
34     }
35     return sum;
36 }
37 int main(void)
38 {
39     int n, m, num;
40     while(~scanf("%d %d", &n, &m))
41     {
42         memset(first, -1, sizeof(first));
43         num = 0;
44         for(int i=0; i<m; ++i)
45         {
46             scanf("%d %d %d", u+num, v+num, w+num);
47             --u[num], --v[num];
48             Next[num] = first[u[num]];
49             first[u[num]] = num++;
50             u[num] = v[num-1], v[num] = u[num-1], w[num] = w[num-1];
51             Next[num] = first[u[num]];
52             first[u[num]] = num++;
53         }
54         printf("%d\n", Prim(n));
55     }
56 }
时间: 2024-10-11 04:45:37

hihoCoder #1109 最小生成树之堆优化的Prim算法的相关文章

hihoCoder#1109 最小生成树三&#183;堆优化的Prim算法

原题地址 坑了我好久...提交总是WA,找了个AC代码,然后做同步随机数据diff测试,结果发现数据量小的时候,测试几十万组随机数据都没问题,但是数据量大了以后就会不同,思前想后就是不知道算法写得有什么问题,因为本来就没什么复杂的地方嘛! 后来,突然灵机一动,莫非又是数组开小了? 突然意识到,我是用数组保存图的,所以对于无向图,边数实际上是输入的2倍,于是把数组开成2倍大小,AC了.... 我总算知道之前这句温馨提示的意思了... 代码: 1 #include <iostream> 2 #in

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

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

hihoCoder_#1109_堆优化的Prim算法

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

hihocoder(1109) 堆优化的Prim算法

这题思路也很简单,就是用一个最大堆堆去维护Prim算法中的Low数组,把刷新Low数组的操作,变成了刷新堆的操作,由于堆的插入操作位logn,查询时间为常数,因此在边稀疏的情况下,其复杂度与Kruscal接近.这题刚开始老是WA,想了很久,不知道错在哪里,后来发现时因此不能直接去堆中的最小路径,因为这条路径的另一个端点有可能已经被用过了. 后来终于发现了,AC. 另外,这一题其实可以直接用priority_queue,代码会少很多呢. Impl: 1 int N, E; 2 vector<pai

hihocoder 第二十九周 堆优化的Prim算法

又深刻理解了一遍prim和dijkstra算法,感觉蛮棒的~ 第一次自己用邻接表写,just soso~ 啊哈~ 一开始被优先队列,重载运算符给卡住了~ 蛋疼~ 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorit

HDU4725 The Shortest Path in Nya Graph(堆优化的dijkstra算法)

题意: 这是一个非常容易解决的问题,您的任务只是计算图像,而仅是计算干草成本和算法成本.如果您不懂此段话,请继续.Nya图是具有“层”的无向图.图中的每个节点都属于一个层,总共有N个节点.您可以以成本C从x层中的任何节点移动到x + 1层中的任何节点,因为道路是双向的,因此也可以以相同的成本从x + 1层移动到x层.此外,还有M个额外的边,每个边连接一对节点u和v,成本为w.帮助我们计算从节点1到节点N的最短路径. 题解: 主要是建图. N个点,然后有N层,要假如2*N个点. 总共是3*N个点.

P3366 【模板】最小生成树(堆优化prim)

堆优化prim 复杂度大概O(nlogn) #include<cstdio> #include<cstring> #include<queue> using namespace std; struct data{ int d,u; bool operator < (const data &tmp) const {return d>tmp.d;} }e[400002]; priority_queue <data> h; bool vis[5

最小生成树之Kruskal算法和Prim算法

依据图的深度优先遍历和广度优先遍历,能够用最少的边连接全部的顶点,并且不会形成回路. 这样的连接全部顶点并且路径唯一的树型结构称为生成树或扩展树.实际中.希望产生的生成树的全部边的权值和最小,称之为最小生成树. 常见的最小生成树算法有Kruskal算法和Prim算法. Kruskal算法每次选取权值最小的边.然后检查是否增加后形成回路,假设形成回路则须要放弃.终于构成最小生成树.n个顶点的图最小生成树过程例如以下: 边的权值升序排序. 选取全部未遍历的边中权值最小的边,推断增加后是否形成回路,若

EOJ 1848 你是ACM吗? 用二叉堆优化dijkstra + spfa算法的学习

Description  随着中国经济的腾飞,中国的物流产业迎来了发展的春天.特别是在上海这样一个拥有广阔国内腹地的国际化大都市,物流业以空前的速度膨胀. 当然是大蛋糕就会吸引许多馋嘴猫,馋嘴猫多了就会有残酷的竞争.当大量资金流入物流产业时,KOP 集团为了稳坐在国内物流业的第一把交椅,决定对现行的运输方案进行改良,以减少自己的成本同时使其它竞争者知难而退. 作为世界100强的KOP集团当然知道要找到最优运输方案,肯定得靠数学和算法很好的软件工程师,于是他们理所当然地找到华东师范大学软件学院.决