最小スパニングツリー[テンプレート]クラスカル

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  CONST  INT MAXX = 0x3f3f3f3f 4  CONST  INT MAXN = 10000 5  構造体ノード
 6  {
 7      INTのU、V、L。
8      ブール 演算子 <(constのノード&A)CONST 
9      {
 10          リターン L < ら。
11      }
 12  }エッジ[MAXN]。
13  INTの父[MAXN]。
14 int型NODENUM、edgenum。
15  ボイドのinit()
 16  {
 17      のためのint型 I = 0 ; I <NODENUM; iが++ 18      {
 19          父[I] = I。
20      }
 21  }
 22  int型の検索(INT X)
 23  {
 24      ながら(父[X] =!X)
 25      {
 26          、X = 父[X]。
27      }
 28      リターンX。
29  }
 30  空隙連合(int型のx、int型のY)
 31  {
 32      INT temp_x = 探す(X)。
33      int型 temp_y = (y)を探します。
34      であれば(temp_x =!temp_y)
 35      {
 36          父[temp_x] = temp_y。
37      }
 38  }
 39  INT クラスカル()
 40  {
 41      ソート(エッジ、エッジ+ edgenum)。
42      のinit();
43      ノード今。
44      INT ANS = 0 45      のためのint型 I = 0 ; I <edgenum; iが++ 46      {
 47は          今= エッジ[I]。
48          もし(検索(now.u)=!検索(now.v))
 49          {
 50              連合(now.u、now.v)。
51の              ANS + = now.l。
52          }
 53      }
 54の     リターンANS。
55  }
 56  のint main()の
 57  {
 58      ながら(scanf関数(" %d個の%のD "、&​​edgenum、&NODENUM)&& edgenum)
 59     {
 60          のためにint型 i = 0 ; I <edgenum; ++ I)
 61          {
 62              のscanf(" %D%D%D "、およびエッジ[I] .U、&エッジ[I] .V、&エッジを[I] .L);
63          }
 64          INT ANS = クラスカル()。
65          ブールフラグ= 0 66          については、int型 I = 2 ; I <= NODENUM;私は++ 67          {
 68              もし(検索(1!)= 検索(i))を
 69              {
70                  フラグ= 1 71                  ブレーク;
72              }
 73          }
 74          であれば(フラグ)
 75          {
 76              COUT << " " << ' の\ n ' ;
77          }
 78          他の
79          {
 80              COUT << ANS << ' の\ n ' ;
81          }
 82      }
 83      リターン 0 84 }

 

おすすめ

転載: www.cnblogs.com/guanwen769aaaa/p/11243387.html