当前位置:   article > 正文

PTA算法题:最小生成树-prim_题目给出一个无向连通图,要求求出其最小生成树的权值。

题目给出一个无向连通图,要求求出其最小生成树的权值。

题目给出一个无向连通图,要求求出其最小生成树的权值。

温馨提示:本题请使用prim最小生成树算法。

输入格式:

第一行包含两个整数 N(1<=N<=1x104),M(1<=M<=2x106) 表示该图共有 N 个结点和 M 条无向边。

接下来 M 行每行包含三个整数 Xi​,Yi​,Zi​ ,表示有一条长度为 Zi​ 的无向边连接结点 Xi​,Yi​ 。

输出格式:

输出一个整数表示最小生成树的各边的长度之和。

输入样例:

  1. 4 5
  2. 1 2 2
  3. 1 3 2
  4. 1 4 3
  5. 2 3 4
  6. 3 4 3

输出样例:

7

 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e4+10,M = 2e6+10;
  4. struct Edge
  5. {
  6. int to,w;
  7. bool operator < (const Edge &o) const
  8. {
  9. return w > o.w;
  10. }
  11. };
  12. vector<Edge> edges[N]; // 存储邻接表信息
  13. bool vis[N];
  14. int dis[N];
  15. int n,m;
  16. void prim()
  17. {
  18. memset(dis, 0x3f, sizeof dis);
  19. dis[1] = 0;
  20. int res = 0;
  21. priority_queue<Edge> q;
  22. q.push({1,0});
  23. while(!q.empty())
  24. {
  25. int t = q.top().to;
  26. q.pop();
  27. if(vis[t]) continue;
  28. vis[t] = true;
  29. res += dis[t];
  30. for(auto &e : edges[t])
  31. {
  32. int k = e.to, w = e.w;
  33. if(dis[k] > w)
  34. {
  35. dis[k] = w;
  36. q.push({k, w});
  37. }
  38. }
  39. }
  40. printf("%d",res);
  41. }
  42. int main()
  43. {
  44. scanf("%d%d",&n,&m);
  45. for(int i = 1;i <= m;i++)
  46. {
  47. int u,v,w;
  48. scanf("%d%d%d",&u,&v,&w);
  49. edges[u].push_back({v,w});
  50. edges[v].push_back({u,w});
  51. }
  52. prim();
  53. return 0;
  54. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/891137
推荐阅读
相关标签
  

闽ICP备14008679号