案例4-1.7 文件传输 (25分)--并查集

 

 

 

 

 

 

 解题思路:(并查集)

1、初始化结点各自成一个单元子集合数组

2、将连通的结点放入同一个集合

#include <stdio.h>
typedef enum {false,true
             } bool;
int f[10001];
void Init(int f[],int n) {//初始化结点各自成单元素子集合
	int i;
	for(i=1; i<=n; i++) {
		f[i]=i;
	}
}
int getf(int x) {//获取根结点
	if(f[x]==x)
		return x;
	else return  f[x]=getf(f[x]);
}

void Union(int f[],int x,int y) {//连通的结点并入同一个集合
	int f1=getf(x);
	int f2=getf(y);
	if(f1!=f2) {
		f[f2]=f1;
	}
}
bool Check_connect(int f[],int x,int y) {//查找是否在同一个集合(即根是否是相同)
	if(getf(x)==getf(y))
		return true;
	return false;
}
int main() {
	int n;
	scanf("%d",&n);
	Init(f,n);
	getchar();
	char c=getchar();
	int x,y;
	while(c!='S') {
		getchar();
		scanf("%d %d",&x,&y);
		if(c=='I') {
			Union(f,x,y);
		} else if(c=='C') {
			if(Check_connect(f,x,y)) {
				printf("yes\n");
			} else
				printf("no\n");
		}
		getchar();
		c=getchar();
	}
	int cnt=0;
	int i;
	for(i=1; i<=n; i++) {//获取连通集个数
		if(f[i]==i)
			cnt++;
	}
	if(cnt!=1)printf("There are %d components.",cnt);
	else printf("The network is connected.");
	return 0;
}
posted @ 2020-03-08 11:26  跃鱼  阅读(281)  评论(0编辑  收藏  举报