처음으로 여자는 분석 관련 질문을 훈련 :
첫 번째는 첫 번째 질문입니다 :
얼마나 많은 표
이 문제에 대한 한 가지 중요한 규칙은 내가 당신을 말한다면 A가 B를 알고이며, B는 A가, B, C가 서로를 알아 의미 C를 알고, 그래서 그들은 하나 개의 테이블에 머물 수 있습니다.
예를 들면 : 나는 당신을 말할 경우 A가 B를 알고, B는 C를 알고, A는, B, C는 하나 개의 테이블에 머물 수 있도록 D는 E를 알고 있으며, D, E가 다른 하나를 유지해야합니다. 그래서 이그나티우스는 적어도 2 개 테이블을 필요로한다.
1 #INCLUDE <iostream> 2 #INCLUDE <STDIO.H> 3 #INCLUDE <string.h> 4 #INCLUDE <알고리즘> 5 #INCLUDE <math.h> 6 7 네임 스페이스를 사용하여 표준; 8 9 INT 사전 [1001]; 구조체 (10)의 노드 { (11) INT (X); INT (12)의 Y; 13}는 [1,001]; (14) 15 INT의 발견 (INT의 X) { INT (16)을 R = X; 17 일 동안 (프리 [R]! = R) R = 18 프리 (R); 19 리턴 R; 20} (21) INT {22) (메인 INT (23)의 N, 1000 I 여부; INT (24) T; 25는 scanf ( "%의 D ', T); 26 일 동안 (T -) { scanf와 27은 ( "%의 D % d에", N, M); // N 친구의 개수는 M 관계의 개수 28 NUM은 = N; 테이블 사이에 앉아까지 // N N 친구 29은 (ⅰ = 1; i가 = N <을, 난 ++) // 사전 배열 초기화 미리 30 [I] = 1; 31 (I = 1; I <= M; 내가 ++) { 32는 scanf ( "%의 D % d에"& A [I] .x를, A [i]를 .Y); (33) // 연결은 여기에 친구를 알고 INT (34) B = 찾기 (a [I] .x를); INT (35) C = 찾기 (a [i]를 .Y); 만약 36 (b! = C) { 미리 37 [C]는 B를 =; 38 num--; 39} 40} 41의 printf ( "% D \ 없음"NUM)는 상기 출력 포맷이 변경 갖는다 // 42} 창 (43) 0; 44}
그래서 내가 먼저 그녀가 화요일 브러시 물 문제가 점차적으로 자신의 신뢰를 구축하기 위해 어려움을 증가했다 배울 수, 브러시 및 물 문제 세트를 확인하기로 결정했다.
다음은 물을 테마 A는 :
A - 교통 프로젝트 부드러운 HDU 1232 (제목 대략 의미)
도시 교통, 기존의 테이블을 얻을 수있는 도시 도로의 지방 설문 조사는 표는 각 도로에 직접 연결되어있는 도시와 마을을 나열합니다. 대상 지방 정부 "원활한 교통 프로젝트"(당신이 도로를 통해 간접적으로 서로에 도달 할 수있는 한,하지만 반드시 직접 도로에 연결되지 않은) 두 마을 사이에 지방이 트래픽을 구현할 수 있도록하는 것입니다. 최소 또한 구축 할 필요가 얼마나 많은 길을 물어?
입력
테스트 입력은 여러 테스트 케이스가 포함되어 있습니다. 각 테스트 케이스는 도시 N (<1,000) 및도 수 M의 수이며, 처음 두 개의 양의 정수의 행을 지정되고, 다음 M 경로에 대응하는 M 개의 행은 각 행은 양의 정수의 쌍을 주어 각각 숫자 직접 통신 경로의 두 마을. 단순화하기 위해, 도시는 1 N. 번까지 번호가 매겨진
참고 : 두 도시 사이에 도로의 번호를 통신 할 수있는,
1 #INCLUDE <iostream> 2 #INCLUDE <STDIO.H> 삼 4 프리 INT [1001]; 5 6 INT의 발견 (INT의 X) {// 루트를 찾기 INT (7)의 R = X; 8해도 ([R]! = R)의 루트 노드를 리턴 // R = 9 사전 (R); INT (10), X = I, J; 11 일 동안 (I! = R) {// 경로 압축기 12 J = 사전 [I]는 상기 기록 // 임시 변수 J의 값은 상부 변경 전에 사용 미리 13 [I] = R, 루트 노드로 직접 상급자 넣어 // 최종 보스 14 내가 J를 =; // 다음 최종 보스로 부모에 원래 우수한을 변경할로 이동 15} 16 리턴 R; 17} (18) 보이드 (19) (A, B의 INT를 INT) 가입 { @ 20 (B)는 통신 여부를 판정한다 21 // 당신은 연결이있는 경우, 당신이 통제 할 수없는 22 //없는 경우는, 그들은 통신 병합에 배치되는 지점 INT (23)의 외환 = 검색 (a); 24 = INT 기 발견 (b); 25 (FX! = FY) 만약 미리 26 [FX] = 기; //하지 최적화, 생성 된 트리 일 수있는 트리 기형 27} (28) INT {29) (메인 INT (30) N; 31 일 동안 (는 scanf ( "%의 D", N) N &&! = 0) { INT (32)의 m, I, A, B, ANS; 33 // 사전의 어레이를 초기화하는 (I = 1; i가 ++; 나는 = N <) 미리 34 [I] = 1; // 35 memset 함수 (프리 0, 사전에 + N); 36는 scanf ( "%의 D", m); 37 (I = 1; I <= m; 내가 ++) { 38는 scanf ( "% d 개 %의 D ', A, 및 B); 가입 39 (a, b); 40} 41 {(ANS = 0, I = 1이면, i가 ++; 나는 = N <) 42의 경우 (전 [I] == I) 43 ++; 44} 45 ans- = 1; 46의 printf ( "% D \ 없음", ANS); 47} 창 48 0; 49}
다음왔다
B는 - 작은 희망의 미로 |? IT 나무입니다입니다 HDU 1272 (질문의 약 의미)
마지막 GARDON 미로 성 작은 희망은 오랜 시간이 (문제 B 참조) 재생, 그리고 지금 그녀는 놓아 미로 GARDON을 디자인하고 싶었다. 하지만 그녀는 디자인 아이디어가 동일하지 미로, 그녀는 그 통로 룸 A와 B가있는 경우이다 양방향 통신이 가능해야한다 먼저 모든 채널의 생각, 후 모두 B를 통해 객실 A로부터 방에 갔다에게 또한 할 수있다 이 어려움을 높이기 위해, 방 B에서 방 a를 통해 갔다, 어떤 작은 희망은 두 개의 객실을 가지고 있으며, (지금은 돌아가하지 않는 한) 하나의 경로 만 통신 할 수 있기를 바랍니다. 약간의 희망은 이제 그녀의 디자인은 당신이 그녀가 그녀의 디자인 아이디어의 설계 여부를 결정하는 데 도움 수 있습니다. 다음의 예 예를 들어, 첫 번째 두 사람은 자격이 있지만, (5)에서 최종 도착 8하는 방법은 두 가지가 있습니다.
입력
입력 데이터 세트를 복수 포함하고, 각 데이터 세트는리스트의 끝에 00의 정수이고, 두 방 채널 연결의 수를 나타낸다. 어떤 방은 적어도 1 이상 100,000 없다. 데이터의 각각의 두 집합 사이에 빈 라인.
전체 파일 (1)의 두 끝.
사실,이 문제는 올바른 템플릿을 사용하기 위해, 더 이상 볼 필요가 또한 제목의 내부 교육과 같은 일부 희미하게보고 시작하지만 것이라 생각합니다. 분리 된 세트에 대한 이해가 충분하지 않은 것 같다. . . .
그리고이 질문은 잘못된 당신이 언급 할 필요가 없습니다 여러 번이의 출력에 사소한 오류이고, 어떤 알고리즘의 순서에 잘못된 템플릿 충분히 조리 아를 요리하지 않습니다!
마지막 AC 코드 :
1 #INCLUDE <iostream> 2 #INCLUDE <STDIO.H> 3 std 네임 스페이스를 사용하여; 4 CONST 5의 INT의 N = 100010; 6 INT 사전 [N, S; 7의 INT NUM [V], V [N]; 8 (9) 공극 초기화 () { 10 (1 = 1을 나타내는 int i가 <= N을, 난 ++) { 미리 11 [I] = 1; 12 V [I] = NUM [I] = 1; // V []의 초기 레코딩 상태 13} 14} 15 INT의 발견 (INT의 X) {// 루트를 찾기 INT (16)을 R = X; 17 일 동안 (프리 [R]! = R)의 루트 노드를 리턴 // R = 18 프리 (R); 19 / * = 난의 X, J int로; 20 동안 (I! = R) {// 경로 압축기 21 J = 사전 [I]는, 종래 임시 변수를 레코딩 그 값 // j는 상부를 변경 미리 22 [I] = R, 루트 노드로 직접 상급자 넣어 // 최종 보스 23 내가 J를 =; // 다음 최종 보스로 부모에 원래 우수한을 변경할로 이동 24} * / 25 반환 R; 26} (27) INT (28) (A, B의 INT를 INT) 가입 { @ 29 (B)는 통신 여부를 판정한다 INT (30)의 외환 = 검색 (a); 31 = INT 기 발견 (b); 32의 경우 (FX == 기) {// 이때 통신는 트리 회로를 생산할 수 있도록한다면 창 (33) (1); 34} (35) 다른 { 미리 36 [FY] = FX // 두 방을 연결하는 동일한 트리에 속하지 않는 37 여부 [X] + = NUM [R]; S = 38 NUM [수정]; 창 39 0; 40 최적화되지 // 얻어진 트리 변형 될 수 나무 41} 42} (43) INT {44) (메인 INT (45)의 I, A, B; 46 동안 (는 scanf ( "% d 개 %의 D ', A, 및 B) && (a =! - 1 || B =! - 1)) { 47 초기화 (); 48 (A == 0 &&의 B == 0) {// 빈 곳 트리 분석한다면 49의 printf ( "예 \ n을"); (50) 계속; 51} // OK 기록 고리의 총 수는 N 기록 노드가 존재하는지 여부, INT (52)는 OK = (a, b), N = V는 [A] + V는 [B]에 가입 53 V [A] = V [B] = 0; 54 (I = 2, N = I는를 <; 내가 ++) { 55는 scanf ( "% d 개 %의 D ', A, 및 B); 만약 56 (A == 0 &&의 B == 0) 브레이크 (57); N = 58 + (V [A] + V [B]); 59 V [A] = V [B] = 0; 60 OK + = 조인 (a, b); 61} 62의 경우 (OK) 63의 printf ( "아니오 \ n을"); (64) 다른 { 65 (S == 않음) 만약 66의 printf ( "예 \ n을"); 67 다른 68의 printf ( "아니오 \ n을"); 69} 70} 창 (71) 0; 72}
요약은 여기를 처음으로 분리 된 세트뿐만 아니라 크게 학습 노력을 강화한다.