


解题思路:(并查集)
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;
}
原文:https://www.cnblogs.com/snzhong/p/12441514.html