주제 링크 : https://vjudge.net/problem/POJ-1789
아이디어 :
그 의미 제목, 길이 7의 문자열의 일부를 주어진 문자열 지점으로 추상화 될 수 있습니다
각 점 사이의 거리가 문자 다른 번호의 다른 문자열로 자신의 문자열입니다.
이사회 후 최소 스패닝 트리입니다.
1 #INCLUDE <STDIO.H> 2 #INCLUDE <iostream> 3 #INCLUDE <큐> 4 하여 공간을 성병; 5 6 CONST INT N = ( INT ) 2e3 + 10 ; 7 CONST INT INF = ( INT ) 1E9; 8 숯 STR [N] [ 10 ]; 9 INT g [N] [N]; 10 의 INT DIS [N]; 11 BOOL 힘 [N]; 12 INT T; 13 (14) 구조체 노드 { 15 INT LOC; 16 INT w; 17 18 부울 친구 연산자 <( CONST 노드 A, CONST 노드 b) { 19 반환 AW> BW; 20 } 21 }; 22 23 priority_queue <노드> 케; 24 (25) INT의 프라임 () { 26 (27) 에 대해 ( INT가 나는 = 1 ; I <= T; I ++ ) { 28 힘 [I] = 0 ; 29 DIS [I] =INF; 30 } 31 32 동안 (! que.pop () que.empty ()); 33 34 que.push (노드 { 1 , 0 }); 35 [DIS 1 ] = 0 ; 36 (37) 동안 (! {que.empty ()) (38) INT U = que.top () LOC.; 39 que.pop (); 40 힘 [유] = 1 ; 41 42 대 ( INT의 V = 1 ; V <= T, V ++ ) { 43 하다면(힘 [V] && DIS [V]>! g [U] [V]) { 44 DIS [V] = g [U] [V]; 45 que.push (노드 {V, DIS [V]}); 46 } 47 } 48 } 49 50 INT ANS = 0 ; 51 대 ( INT가 나는 = 1 ; I <= T; I ++ ) 52 ANS + = DIS [I]; 53 54 복귀 ANS; 55 } 56 57 INT의 주 () { 58 (59) 동안 (scanf와 ( "%의 D ' , T)) { 60 (61) 의 경우 (T)! 체류 ; 62 (63) 에 대한 ( INT가 나는 = 1 ; I <= T; I ++ ) (64) 는 scanf ( " % S " , STR [I]), (65) 66 (67) INT에서 CNT = 0 , 68 대 ( INT가 나는 = 1 ; I <= T; I ++ ) { 69 대 ( INT J = 나 + 1 , J <= T, J ++ ) { 70 = CNT 0 ] (71)은 72 // 각 점의 거리와 다른 점 (73)이된다 위해 ( INT O = 0 ; O < . 7 ; O ++ ) 74 IF (! STR [I] [O] = STR [J] [O]) 75 ++ CNT; 76 (77) G [I] [J] = G [J] [I] = CNT; 78 } 79 } 80 81 대 ( INT I = 1. ; I <= T; I ++ ) 82 G [I] [I] = 0 ; 83 / * 84 대 (INT 난 = 1; I <= T; I ++) { 85 대 (INT J = 1; J <= T, J ++) 86 의 printf ( "%의 D", g [I] [J]) ; 87 의 printf ( "\ n"); 88 } 89 * / 90 의 printf는 ( " 최고 가능한 품질을 1 / D % \ n. " 프라임 ()); 91 } 92 93 복귀 0 ; 94 }