fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //Union_Find
  4. long long ufpar[100005], ufrank[100005];
  5.  
  6. //初期化
  7. void ufinit(int n){
  8. for(int ii = 1; ii <= n; ii++){
  9. ufpar[ii] = ii;
  10. ufrank[ii] = 0;
  11. }
  12. }
  13.  
  14. //木の根を求める
  15. int uffind(long long x){
  16. if(ufpar[x] == x) {
  17. return x;
  18. } else {
  19. ufpar[x] = uffind(ufpar[x]);
  20. return ufpar[x];
  21. }
  22. }
  23.  
  24. //併合
  25. void ufunite(long long x, long long y){
  26. x = uffind(x);
  27. y = uffind(y);
  28. if(x == y) return;
  29. if(ufrank[x] < ufrank[y]){
  30. ufpar[x] = y;
  31. } else {
  32. ufpar[y] = x;
  33. if(ufrank[x] == ufrank[y]) ufrank[y]++;
  34. }
  35. }
  36.  
  37. //同じ集合か
  38. bool ufsame(long long x, long long y){
  39. return uffind(x) == uffind(y);
  40. }
  41.  
  42. //Kruskal (Union_Findが必要)
  43. const int max_e=200000;
  44. struct edge { int u, v; long long cost; };
  45. bool comp(const edge& e1, const edge& e2){
  46. return e1.cost < e2.cost;
  47. }
  48. edge es[max_e]; //各辺の情報を持つ
  49. int v,e; //頂点数、辺数
  50. int kruskal(){
  51. sort(es, es + e, comp);
  52. ufinit(v);
  53. long long res = 0;
  54. for(int i = 0; i < e; i++){
  55. edge e = es[i];
  56. if(!ufsame(e.u, e.v)){
  57. ufunite(e.u, e.v);
  58. res += e.cost;
  59. }
  60. }
  61. return res;
  62. }
  63.  
  64. int main (){
  65. cin >> v >> e;
  66. edge em;
  67. for(int i=0;i<e;i++){
  68. int s,t,w;
  69. cin >> s >> t >> w;
  70. em.u=s; em.v=t; em.cost=w;
  71. es[i]=em;
  72. }
  73. cout << kruskal() << endl;
  74. return 0;
  75. }
Success #stdin #stdout 0s 4492KB
stdin
6 9
0 1 1
0 2 3
1 2 1
1 3 7
2 4 1
1 4 3
3 4 1
3 5 1
4 5 6
stdout
5