万岛之国


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

    }

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值