#C10L01P01. C10.L01.并查集.例题.网络.1

C10.L01.并查集.例题.网络.1

题目描述

有 N 个计算机中心(编号为 1,2,3,…,N ),开始时都是独立的。后来不断的架设了 M 条网线,每条网线把其中的 2 个计算机中心连接起来。直接或间接链接的计算机中心都可以相互通信,组成一个网络。问有多少个网络?

输入格式

第 1 行:两个整数 N、M ,N 范围 [1,3000],M 范围 [1,3000]。

下面 M 行:每行 2 个整数,表示网线连接的计算机中心编号。

输出格式

一个整数,表示有多少个不连通的网络。

样例

5 4
1 5
2 3
2 4
3 4
2

完善程序

// O(N*N) 
#include<bits/stdc++.h>
using namespace std;
int N,M,ans;
struct Tnode{
	int num; // 点的编号 
	int id; // 点所在的块 id 
};
Tnode f[10000]; 
void init(){
	cin>>N>>M;
	for(int i=1;i<=N;i++)
		f[i].num=f[i].id=i;//最开始,id 都不一样
	ans=__填空(1)__; 
}
int main(){

	init();
	for(int i=0;i<M;i++){
		int a,b,ida,idb;
		cin>>a>>b;
		ida = f[a].id;
		idb = f[b].id;
		if(ida!=idb){
			for(int j=1;j<=N;j++)
				if(__填空(2)__)
					f[j].id = idb; //改为相同的 id 
			__填空(3)__; // 连通块的数量减少 1 个
		}
	}
	cout<<ans;
	
    return 0;
}

填空(1):{{ input(1) }}

填空(2):{{ input(2) }}

填空(3):{{ input(3) }}