解题思路:(并查集)
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 "); } else printf("no "); } 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; }