최소 스패닝 트리 [템플릿] 크루스 칼

1 #INCLUDE <. 비트 / stdc ++ H>
 2  사용  스페이스 성병;
3  CONST  INT 맥스 = 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  공극 초기화 ()
 16  {
 (17)      에 대해 ( int로 I = 0 ; I <NODENUM; 내가 ++ )
 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로 = 1을 0 ; 나는 <edgenum; 내가 ++ )
 46      {
 47          지금 = 가장자리 [I];
48          경우 (찾기 (now.u)! = 찾기 (now.v))
 49          {
 50              연합 (now.u, now.v);
51              ANS + = 드릴수;
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] .엘);
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