hdu/hdoj 1232 원활 한 공사

원활 한 공사
Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22833    Accepted Submission(s): 11896
Problem Description
모 성 은 도시 의 교통 상황 을 조사 하여 기 존의 도시 도로 통계 표를 얻 었 고 표 에는 모든 도로 가 직접 연 결 된 도시 가 열거 되 어 있다.성 정부의'원활 한 공사'목 표 는 성 전체의 어느 두 도시 간 에 도 교통 을 실현 할 수 있 도록 하 는 것 이다.--최소한 몇 개의 도 로 를 더 건설 해 야 하나. 
 
Input
테스트 입력 은 약간의 테스트 용례 를 포함한다.각 테스트 사례 의 첫 번 째 줄 은 두 개의 정 수 를 제시 하 는데 그것 이 바로 도시 수량 N(<1000)과 도로 수량 M 이다.그 다음 에 M 줄 은 M 개의 도로 에 대응 하고 각 줄 은 한 쌍 의 정 수 를 제시 하 는데 각각 이 도로 가 직접 연 결 된 두 도시 의 번호 이다.간단하게 말하자면,도 시 는 1 부터 N 까지 번호 가 있다. 
주의:두 도시 사이 에 여러 개의 길이 통 할 수 있 습 니 다.즉,
3 3
1 2
1 2
2 1
이런 입력 도 합법적이다
N 이 0 일 때 입력 이 끝나 면 이 용례 는 처리 되 지 않 습 니 다. 
 
Output
각 테스트 사례 에 대해 서 는 1 줄 에서 최소 건설 해 야 할 도로 수 를 출력 한다. 
 
Sample Input

   
   
   
   
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0

 
Sample Output

   
   
   
   
1 0 2 998
Hint
Hint
Huge input, scanf is recommended.

 전형 적 인 조사 집 은 그 중에서 경로 압축 기술 과 모든 나무의 높이 를 기록 하여 효율 적 인 합병 을 했다.
#include<iostream>
#include<cstdlib>
using namespace std;
const int maxn=1000+10;
int par[maxn],rank[maxn];
void initset(int n){
	for(int i=1;i<=n;i++){
		par[i]=i;
		rank[i]=0;
	}
}
int find(int x){
	if(par[x]==x)return x;
	return par[x]=find(par[x]);
}
void unionset(int x,int y){
	x=find(x);
	y=find(y);
	if(x==y)return ;
	if(rank[x]<rank[y]){
		par[x]=y;
	}
	else {
		par[y]=x;
		if(rank[x]==rank[y]) rank[x]++;
	}
}
int main()
{
	int n,m;
	while(cin>>n)
	{
		if(n==0)break;
		cin>>m;
		int ans=n-1;
		initset(n);
		for(int i=0;i<m;i++)
		{
			int x,y;
			cin>>x>>y;
			if(find(x)!=find(y)) {unionset(x,y);ans--;}
		}
		cout<<ans<<endl;
	}
	return 0;
}

좋은 웹페이지 즐겨찾기