问题 A: 英雄联盟阵营

题目描述

符文之地——瓦罗兰,作为最大的一块魔法大陆,它居于符文之地心脏中心,是符文之地面积最大的大陆。所有谋求符文之地霸权的势力,都将焦点放在了瓦罗兰。
近200年来的战争和纷争导致魔法滥用,军队用法术和符文武装自己,英雄们打造出大部分魔法物品率领部队厮杀。他们拥有近乎无限的原始魔法力量使用,从未考虑过无止境的滥用魔法会给这片大陆的环境带来怎么样的灾难。最后两次符文之战影响了瓦罗兰的地质环境。地震和魔法风暴让整个瓦罗兰为之颤抖,对人们来说这份恐惧远超过战争的恐怖。人们终于意识到世界已经承受不起符文之战的破坏。
为了回应世界上不断恶化的政治和经济危机,瓦罗兰的大法师们达成共识,冲突以可控和系统化的方式来处理。他们成立了一个叫英雄联盟的组织。
但联盟的纷争并没有消失,以德玛西亚和诺克萨斯等阵营的英雄们继续为他们的信念而战。 

输入

第一行有两个整数n,m。
n(0 < n < 100)表示有n个英雄;m(0 < m < 100)表示接下来有m行数据。
接下来m行,每行都有两个整数a,b。表示a,b英雄在同一个阵营。在默认情况下,任意两个英雄不在同一阵营。

输出

输出n个英雄的阵营的个数。

样例输入复制

5  3
1  2
2  3
4  5

样例输出复制

2
#include <iostream>
#include <cstring>

using namespace std;
const int maxn = 105;

int F[maxn];

int Find(int x)
{//查找x的父节点
    if(F[x]==x)return x;
    else return F[x]= Find(F[x]);//递归查找,路径压缩
}

bool Union(int x,int y)
{//x,y是否相连
    int dx= Find(F[x]);
    int dy= Find(F[y]);
    if(dx==dy)return false;
    F[dy]=dx;
    return true;
}
int Count(int n)
{//求连通分量
    int count =0;
    for (int i = 1; i <=n ; ++i)
    {
        if(F[i]==i)count++;
    }
    return count;
}
int main()
{
    int n,m;
    cin>>n>>m;
    memset(F,0, sizeof(F));
    for(int i=1;i<=n;i++)F[i]=i;
    int a,b;
    for(int i=0;i<m;i++)
    {
        cin>>a>>b;
        Union(a,b);
    }
    cout<<Count(n)<<endl;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VICTOR.杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值