NOI 4.3 도 론 1526: 종교 신앙

제목:http://noi.openjudge.cn/ch0403/1526/
1526: 종교 신앙
총 시간 제한: 5000ms    메모리 제한: 65536kB
묘사 하 다.
세상 에는 많은 종교 가 있 습 니 다. 당신 이 흥 미 를 느끼 는 것 은 당신 학교의 학우 들 이 몇 가지 종 교 를 믿 는 지 입 니 다.
당신 의 학교 에는 n 명의 학생 (0 < n < = 50000) 이 있 습 니 다. 당신 은 모든 사람의 종교 신앙 에 대해 물 어 볼 수 없습니다. 왜냐하면 그들 은 밝 히 기 를 원 하지 않 기 때 문 입 니 다.그러나 두 명의 학생 을 동시에 찾 았 을 때 그들 은 같은 종 교 를 믿 는 지 여 부 를 알려 주 고 싶 어 한다. 이런 질문 을 통 해 학교의 종교 수의 상한 선 을 추산 할 수 있다.너 는 모든 학생 들 이 가장 많은 종교 만 믿는다 고 생각 할 수 있다.
 
입력
여러 그룹의 데 이 터 를 입력 하 십시오.각 그룹의 데이터 의 첫 줄 은 n 과 m, 0 < = m < = n (n - 1) / 2 를 포함 하고 그 다음 에 m 줄 은 두 개의 숫자 i 와 j 를 포함 하 며 학생 i 와 학생 j 가 같은 종 교 를 믿 고 학생 들 은 1 에서 n 으로 표시 된다.입력 은 한 줄 n = m = 0 으로 끝 납 니 다.
출력
각 그룹의 데이터 에 대해 먼저 번호 (1 부터) 를 출력 한 다음 에 학생 들 이 믿 는 서로 다른 종교 의 수량 상한 선 을 출력 한다.
샘플 입력
10 9
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
10 4
2 3
4 5
4 8
5 8
0 0

샘플 출력
Case 1: 1
Case 2: 7

 -----------------------------------------------------
사고의 방향
제목: 그림 속 노드 의 연결 관 계 를 알 고 그림 속 의 연결 수량 을 구 합 니 다.
템 플 릿 문 제 를 수집 합 니 다.그리고 조사 집 에 대한 상세 한 소 개 는 이 신기 한 박문 을 볼 수 있 고 매우 재 미 있 는 것 과 상세 한 설명 을 찾 을 수 있다.
-----------------------------------------------------
코드 
//    

#include
#include
using namespace std;

const int NMAX = 50005;
int pre[NMAX] = {};								//         
int n = -1;										//     :    
int cnt = n;									//     :      

int find(int x)									//          ,              
{
	int r = pre[x],t = x;
	while (r!=t)								//        (   ==  ),     
	{
		t = r;
		r = pre[t];
	}
	//       
	t = x;
	int tt = x;
	while (t!=r)								//          ,                    
	{
		tt = pre[t];
		pre[t] = r;
		t = tt;
	}

	return r;
}

void join(int x, int y)							//           
{
	int xx = find(x), yy = find(y);				//             
	if ( xx!= yy)								//             ,      ;                
	{
		cnt--;									//       -1
		pre[xx] = yy;							//                         
	}
}



int main()
{
#ifndef ONLINE_JUDGE
	ifstream fin ("0403_1526.txt");
	int m,i,x,y,t=0;
	while (fin >> n >> m)
	{
		if (n==0 && m==0)
		{
			break;
		}
		for (i=0; i> x >> y;
			join(x,y);
		}
		cout << "Case "<< (++t) << ": " << cnt << endl;
	}
	fin.close();
#endif
#ifdef ONLINE_JUDGE
	int m,i,x,y,t=0;
	while (cin >> n >> m)
	{
		if (n==0 && m==0)
		{
			break;
		}
		for (i=0; i> x >> y;
			join(x,y);
		}
		cout << "Case "<< (++t) << ": " << cnt << endl;
	}
#endif
}

좋은 웹페이지 즐겨찾기