当前位置:   article > 正文

走廊泼水节(最小生成树求最小完全图)

走廊泼水节

传送门:走廊泼水节

思路:在求最小生成树的过程中会有很多连通块,合并每一个连通块时同时也要将两个连通块连成一个完全图,合并联通块的w是最长的一条边,也要保证是完全图求最小生成树时不变的一条边,所以额外连的边都必须>=w+1,连的边数是两个连通块的数量积减1,用一个res记录额外的边的总长

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include <cmath>
  4. #include<algorithm>
  5. #include <vector>
  6. #include <stack>
  7. #define x first
  8. #define y second
  9. using namespace std;
  10. typedef long long LL;
  11. typedef pair<int,int>PII;
  12. const int N=6010,M=N*N;
  13. int n,m,k;
  14. int f[N],cnt[N];
  15. struct edge
  16. {
  17. int a,b;
  18. double c;
  19. }edges[N];
  20. bool cmp(edge a,edge b)
  21. {
  22. return a.c<b.c;
  23. }
  24. double get_dist(PII a,PII b)
  25. {
  26. int dx=a.x-b.x;
  27. int dy=a.y-b.y;
  28. return sqrt(dx*dx+dy*dy);
  29. }
  30. int get(int x)
  31. {
  32. if(f[x]==x)
  33. return x;
  34. return f[x]=get(f[x]);
  35. }
  36. int main()
  37. {
  38. int t;
  39. cin>>t;
  40. while(t--)
  41. {
  42. cin>>n;
  43. for(int i=1;i<n;i++)
  44. {
  45. int a,b,c;
  46. cin>>a>>b>>c;
  47. edges[i]={a,b,c};
  48. }
  49. sort(edges+1,edges+n,cmp);
  50. for(int i=1;i<=n;i++) f[i]=i,cnt[i]=1;
  51. int res=0;
  52. for(int i=1;i<n;i++)
  53. {
  54. int a=get(edges[i].a),b=get(edges[i].b),c=edges[i].c;
  55. if(a!=b)
  56. {
  57. res+=(cnt[a]*cnt[b]-1)*(c+1);
  58. cnt[b]+=cnt[a];
  59. f[a]=b;
  60. }
  61. }
  62. cout<<res<<endl;
  63. }
  64. return 0;
  65. }

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

闽ICP备14008679号