6 万岛之国
Time Limit:6000MS Memory Limit:65535K
题型: 编程题 语言: 无限制
描述
印度尼西亚被称为万岛之国,但随着全球变暖,海平面逐渐下降,一些岛屿由露出海面的陆地连接起来 地理部门每隔一段时间,就会发布哪个岛屿与哪个岛屿之间的陆地连起来了,格式如下: Y 1 5 Y代表一条两岛屿陆地连起来了的信息,1和5分别代表两个岛屿编号 当地官员时刻关心万岛之国,究竟岛屿还有多少个(连上的岛就只算一个了) 查询格式如下: Q Q代表查询当前有多少个岛 一开始时,每个岛都是被海水分隔的,请编程实现上述处理要求
输入格式
第一行一个数N(1<=N<=1,000,000),表示岛的编号分别为1到N 第二行一个数M(1<=100,000),表示岛屿连上的信息(或查询请求)的总数 此后M行,一行一条岛屿连上的信息或查询请求
输出格式
每个查询请求,输出当前岛屿数量
输入样例
10 9 Q Y 1 5 Q Y 2 7 Q Y 7 1 Q Y 2 5 Q
输出样例
10 9 8 7 7
#include<iostream>//这个题 主要是对并查集的 考察 #include<cstdlib> #include <cstdio> using namespace std; int Find(int T[],int &i) { int depeth=1; // 并查树的深度 用于进行优化 for(;T[i]!=i;i=T[i],depeth++) ; return depeth; //返回深度 并且i 就是 最上层节点的 下标 } void Union(int T[]) { int p,q; cin>>p>>q; // 把下标为 p q 的连接在一块 int a,b; // 为 p ,q 树集的深度 a=Find(T,p); b=Find(T,q); a>b? (T[q]=T[p]):( T[p]=T[q]) ;//合并两个树 使合成的树 深度最小 } bool Connected(int T[],int p,int q) { Find(T,p)==Find(T,q); //两个节点的树根 是否相同 来判断 是否为一个集合 if(T[p]==T[q]) return 1; else return 0; } int Count(int T[],int n) { int sum=0; for(int i=1;i<=n;i++) if(T[i]==i) sum++; //遍历所有的节点 有几个更节点 return sum; } int main() { //freopen("a","r",stdin); int n,m; cin>>n>>m; int *T=(int *)malloc((n+1)*sizeof(int)); for(int i=1;i<=n;i++) T[i]=i; char ch; while(m--) { cin>>ch; switch(ch) { case 'Q' : cout<<Count(T,n)<<endl;break; case 'Y' : Union(T);break; } } }