05-树8 File Transfer(25 分)

#include  
int main()
{
	int N,i,M=0;
	int connect[10001]={0};
	char c;
	scanf("%d",&N);
	getchar();
	scanf("%c",&c);
	int S=0;
	while(c!='S'){
		int a,b;
		scanf("%d %d",&a,&b);
		if(c=='C'){        //check 
			while(connect[a])a=connect[a];
			while(connect[b])b=connect[b];
			if(a==b&&a!=0)printf("yes\n");
			else printf("no\n");
		}
		else if(c=='I'){   //inputting a connection 
		    while(connect[a])a=connect[a];    //查找两个点所属于的集合的根节点 
		    while(connect[b])b=connect[b];
		    if(a!=b){                         //如果属于不同的集合 
		    	if(S==b){connect[a]=b;S=b;}    //如果b集合作为主集合,则将a集合合并到b集合 
		    	else {connect[b]=a;S=a;}       //这么做主要是为了当递增或递减输入连接时,树的高度不会太高,
				                              //这样做不太合理,因为合并两课高度大于1的树时就是随机的。 
		    }
    	}
    	getchar();   //getchar不需要 ?? 
    	scanf("%c",&c);
	}
	for(i=1;i<=N;i++){         //查找集合的个数,即值为0的点的个数 (根节点) 
		if(connect[i]==0)M++;
	}
	if(M<=1)printf("The network is connected.");   //M=1也应该是对的,因为之前写的合并方法可能会使两个节点之间存在两条路径 
	else printf("There are %d components.",M);
	return 0;
}

你可能感兴趣的:(中国大学MOOC-陈越,何钦铭-数据结构-2018春)