网络交友

网络交友

描述
在网络社交的过程中,通过朋友,也能认识新的朋友。在某个朋友关系图中,假定 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.csdn.net/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;
}

猜你喜欢

转载自www.cnblogs.com/rebirth-death2019/p/10992664.html
今日推荐