并查集朋友圈的范围



解题说明:

  这里并不能初始化每个人的根节点,怎么办?用集合set记录已经初始化的,来一个人,你有没有之前朋友记录,没有—>先初始化根节点自己,朋友圈范围dis[]=1.之前有->查找朋友根节点,根节点不相同,合并集合,并把其中一个集合根节点范围dis[]改为加上另一个集合的dis[]之后的和.至此完成。
代码

#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<string>
using namespace std;
set<string>st;
map<string,string>m;
map<string,int>dis;
int result[5005];
string get(string s){
	if(m[s]==s)return s;
	return m[s]=get(m[s]);
}
int main(){
	int n;cin>>n;
	string ip1,ip2;
	for(int i=1;i<=n;i++){
		cin>>ip1>>ip2;
		if(!st.count(ip1)){
			dis[ip1]=1;
			m[ip1]=ip1;
			st.insert(ip1);
		}
		if(!st.count(ip2)){
			dis[ip2]=1;
			m[ip2]=ip2;
			st.insert(ip2);
		}
		ip1=get(ip1);ip2=get(ip2);
		if(ip1!=ip2){
			m[ip1]=ip2;
			dis[ip2]+=dis[ip1];
		}
		result[i]=dis[ip2];
	}
	for(int i=1;i<=n;i++)cout<<result[i]<<endl;
	return 0;
} 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值