码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-09-02 18:48:01      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:

原题地址: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 }

 

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

标签:

原文地址:http://www.cnblogs.com/gwtan/p/4779203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!