万岛之国

来源:互联网 发布:微信淘宝客论坛 编辑:程序博客网 时间:2024/04/30 07:29


6  万岛之国

Time Limit:6000MS  Memory Limit:65535K

题型: 编程题   语言: 无限制

描述

印度尼西亚被称为万岛之国,但随着全球变暖,海平面逐渐下降,一些岛屿由露出海面的陆地连接起来地理部门每隔一段时间,就会发布哪个岛屿与哪个岛屿之间的陆地连起来了,格式如下:Y 1 5Y代表一条两岛屿陆地连起来了的信息,1和5分别代表两个岛屿编号当地官员时刻关心万岛之国,究竟岛屿还有多少个(连上的岛就只算一个了)查询格式如下:QQ代表查询当前有多少个岛一开始时,每个岛都是被海水分隔的,请编程实现上述处理要求

输入格式

第一行一个数N(1<=N<=1,000,000),表示岛的编号分别为1到N第二行一个数M(1<=100,000),表示岛屿连上的信息(或查询请求)的总数此后M行,一行一条岛屿连上的信息或查询请求

输出格式

每个查询请求,输出当前岛屿数量

输入样例

109QY 1 5QY 2 7QY 7 1QY 2 5Q

输出样例

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