网络交友

本文探讨了网络交友场景下使用并查集算法解决朋友圈合并问题的方法。通过实例介绍了如何利用并查集维护朋友圈关系,实现高效的朋友圈规模计算。

网络交友

描述
在网络社交的过程中,通过朋友,也能认识新的朋友。在某个朋友关系图中,假定 A 和 B 是朋友,B 和 C 是朋友,那么 A 和 C 也会成为朋友。即,我们规定朋友的朋友也是朋友。

现在要求你每当有一对新的朋友认识的时候,你需要计算两人的朋友圈合并以后的大小。

输入
第一行:一个整数 n(n\leq 5000)n(n≤5000),表示有 nn 对朋友认识。

接下来 nn 行:每行输入两个名字。表示新认识的两人的名字,用空格隔开。(名字是一个首字母大写后面全是小写字母且长度不超过 20 的串)。

输出
对于每一对新认识的朋友,输出合并以后的朋友圈的大小。

输入样例 1
3
Fred Barney
Barney Betty
Betty Wilma
输出样例 1
2
3
4

提示

提示:用map把字符串映射成为数字,然后并查集来维护集合大小。

这道题是一道并查集的基础题,但基本结构是比较清晰。

  • 初始化
void init(){
    for(int i=1;i<=n;i++){
        fa[i]=i;
        sz[i]=1;
    }
}
  • 定义查找到节点,但这输入的是字符,用string。
string get(string x){
    if( father[x] == x ){
        return x;
        }
    return get( father[x] );
}
  • 将其中第X个节点的节点转换到Y的节点。
   void merge (string x,string y){
        string a , b;
        a = get(x);
        b = get(y);
        if( a != b ){
            father[a] = b; 
            sizes[b] += sizes[a];
        }
        cout<<sizes[b]<<endl; 
        
    }

这道题基本结构就这样,但是,都说了是并查集,因此,你可以https://blog.youkuaiyun.com/ebirth/article/list/2?这里来找我。

代码;

#include<bits/stdc++.h>
using namespace std;
map<string,string> father;
map<string,int> sizes;
 
string get(string x)
{
    if( father[x] == x )
    {
        return x;
    }

    return get( father[x] );
    
}
void merge (string x,string y){
    string a , b;
    a = get(x);
    b = get(y);
    if( a != b ){
        father[a] = b; 
        sizes[b] += sizes[a];
    }
    cout<<sizes[b]<<endl; 
    
}
int main(){
    int n,i,id=1;
    string a,b;
    cin>>n;
    
    for(i=0;i<n;++i){
        cin>>a>>b;
        if(father[a]==""){
            father[a] = a;
                sizes[a] = 1;
        } 
        if(father[b]==""){
            father[b] = b;
            sizes[b] = 1;    
        } 
        merge(a,b);        
    } 
    return 0;
}

 

转载于:https://www.cnblogs.com/rebirth-death2019/p/10992664.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值