ブルーブリッジカップ共同根付いた植物互いに素セット

歴代一緒質問論文植物の根

リソース制限の
制限時間:2.0Sメモリ制限:256.0メガバイト
の問題点を説明
  惑星wはプランテーションは、* Mの小さな正方形にn個(m行西方向、南北方向、n列)に分割されます。各フレームの家は、共同根付いた植物が植えられました。
  この植物は、根が全体として他の格子を合成する植物と、南北または東西方向に沿って延びることができるという特徴を有しています。

私たちは根現象の間に小さなグリッドがあったことを言った場合はどう、あなたは公園で一緒に植物のどのくらいの歪みを根総権を伝えることができますか?
入力形式の
  スペースで分離された第1行の行数、二つの整数をm、nは、グリッドは、列の数(1 <M、N <1000を表します )。
  次の行、整数k、kは次のように表すデータ線(0 <K <100000)は、
  次のk行、最初の行二つの整数、B、その数は小さい格子と小さな格子bの数でありますルート一緒に。

グリッド番号は、右の数値に左、上から下へ、行ずつ。
  5×4小格子、ID:たとえば
  。1 3 2 4
  5 6 8 7
  9 11 10 12である
  13 14 15 16
  17 19 18 20である。
サンプル入力
5 4
16
2 3
1 5。
5 9
4 8
7 8
9 10
10 。11
。11 12である
10 14
12 16
14 18れている
。17 18である
15 19
19 20
9 13は
13である。17
出力例
5
例の説明
  図係合ルートの場合を基準としたその
ここに画像を挿入説明
互いに素セットが思っリンク

#include<stdio.h>

int pre[1000*1000];
int count=0;

int find(int num){
	while(num!=pre[num]){
		num = pre[num];
	}
	return num;
}

void join(int num1,int num2){
	if(find(num2)!=find(num1))
		pre[find(num2)]=find(num1);
}

int main(){
	int m,n,k,num1,num2;
	scanf("%d %d",&m,&n);
	scanf("%d",&k);
	for(int i=1;i<=m*n;i++)
		pre[i]=i;
	for(int i=1;i<=k;i++){
		scanf("%d %d",&num1,&num2);
		join(num1,num2);
	}	
	for(int i=1;i<=m*n;i++)
		if(find(i)==i){
			count++;
		}
	printf("%d",count);
	return 0;
}
公開された13元の記事 ウォン称賛13 ビュー323

おすすめ

転載: blog.csdn.net/qq_43320728/article/details/104587679