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