解题说明:
这里并不能初始化每个人的根节点,怎么办?用集合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;
}