【cf】I. Invoking the Magic(并查集+map)

11 篇文章 0 订阅

 

解题思路:这道题目用并查集查找同一集合内节点个数最大的个数是多少,因为数据量很大需要用map映射结果,另外这个题目有点搞心态,卡了我cin,以后再也不用cin了

下面附上ac代码

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <unordered_map>
#define dbg(a)  cout<<#a<<" : "<<a<<endl;
using namespace std;
typedef long long ll;
ll fa[200005];
ll a[200005];
ll b[200005];
ll rnk[200005];
unordered_map<ll,ll> Fa,m;
ll find(ll x)
{
    //return x==fa[x]?x:(fa[x]=find(fa[x]));
    if(fa[x]==x)
        return x;
    else{
        fa[x]=find(fa[x]);  //父节点设为根节点,减少后续查找时间
        return fa[x];   //返回父节点
    }
}
ll find_map(ll x)
{
    return x==Fa[x]?x:(Fa[x]=find_map(Fa[x]));
}
void merge(ll i,ll j)
{
    ll x=find(i);
    ll y=find(j);
    if(rnk[x]<=rnk[y]){
        fa[x]=y;
    }
    else{
        fa[y]=x;
    }
    if(x!=y && rnk[x]==rnk[y])
    {
        rnk[y]++;
    }
}
void init(ll n)
{
    for(ll i=1;i<=n;i++)
    {
        fa[i]=i;
        rnk[i]=1;
    }
}
int main()
{
    //std::ios::sync_with_stdio(false);
    //cin.tie(0),cout.tie(0);
    ll t;
    cin>>t;
    ll n;
    ll ans;
    while(t--)
    {
        Fa.clear();
        m.clear();
        scanf("%lld",&n);
        //init(n);
        for(ll i=1;i<=n;i++)
        {
            scanf("%lld%lld",&a[i],&b[i]);
            Fa[a[i]]=a[i];  //每个节点各自为一个集合
            Fa[b[i]]=b[i];
        }
        for(ll i=1;i<=n;i++)
        {
            if(find_map(a[i])!=find_map(b[i])) //如果两只袜子不属于同一集合,合并
                Fa[find_map(a[i])]=find_map(b[i]);
        }
        ll maxx=0;
        for(ll i=1;i<=n;i++)
        {
            m[find_map(a[i])]++;
            m[find_map(b[i])]++;
            maxx=max(maxx,m[find_map(a[i])]);
            maxx=max(maxx,m[find_map(b[i])]);
        }
        printf("%lld\n",maxx/2);
    }
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值