10 월 분리 된 세트의 마지막에 관련된 문제의 분석

처음으로 여자는 분석 관련 질문을 훈련 :

첫 번째는 첫 번째 질문입니다 :

얼마나 많은 표

오늘은 이그나티우스의 생일입니다. 그는 많은 친구를 초대합니다. 지금은 저녁 식사 시간이다. 이그나티우스는 그가 적어도 필요 얼마나 많은 테이블을 알고 싶어. 당신은 모든 친구들이 서로를 알아 통지해야하고, 모든 친구들은 낯선 사람과 있고 싶어하지 않는다.

이 문제에 대한 한 가지 중요한 규칙은 내가 당신을 말한다면 A가 B를 알고이며, B는 A가, B, C가 서로를 알아 의미 C를 알고, 그래서 그들은 하나 개의 테이블에 머물 수 있습니다.

예를 들면 : 나는 당신을 말할 경우 A가 B를 알고, B는 C를 알고, A는, B, C는 하나 개의 테이블에 머물 수 있도록 D는 E를 알고 있으며, D, E가 다른 하나를 유지해야합니다. 그래서 이그나티우스는 적어도 2 개 테이블을 필요로한다.
 
이 끊긴 세트 템플릿 질문입니다,하지만 난 템플릿을 사용하기 전에 잠시 동안 좋은 템플릿을 찾고, 항목을 상대적으로 알려지지 설정된 연결되지 않은, 그래서 읽고, 나는 분리 된 세트의 숙달이 매우 약한 알고 있습니다. 내 해체 설정된 템플릿 기반 학습 연습의 변화했다 : HDU-1233 또는 프로젝트를 신속하게 (최소 스패닝 트리 및 분리 된 세트)
코드를 복사
 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. 번까지 번호가 매겨진 
참고 : 두 도시 사이에 도로의 번호를 통신 할 수있는,

emmm이 매우 명백한 물 문제, 즉하지만, 템플릿 세트, 나를 간략하게이 알고리즘의 일반적인 생각을 이해하자. 간단한 질문, 간단한 A.
 
코드를 복사
 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}
코드를 복사

 

요약은 여기를 처음으로 분리 된 세트뿐만 아니라 크게 학습 노력을 강화한다.

추천

출처www.cnblogs.com/sanluohubo/p/11768523.html