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