首页 > 其他 > 详细

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

时间:2020-03-08 12:10:08      阅读:140      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 技术分享图片

 

 技术分享图片

 

 

 解题思路:(并查集)

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;
}

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

原文:https://www.cnblogs.com/snzhong/p/12441514.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!