HDU-3172-Virtual Friends(基础并查集)

该博客探讨了一种模拟网站上社交网络增长的方法,利用并查集数据结构来跟踪每个人的朋友网络规模。每个友谊是双向的,输入包含多个友谊测试用例,输出显示每次新友谊形成时社交网络的大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目
你可以使用各种网站来结交虚拟朋友。对一些人来说,扩大他们的社交网络(他们的朋友,朋友的朋友,朋友的朋友的朋友,等等)已经成为一种上瘾的爱好。就像有些人收集邮票,有些人收集虚拟的朋友。
你的任务是观察这样一个网站上的互动,并跟踪每个人的网络规模。
假设每段友谊都是相互的。如果弗雷德是巴尼的朋友,那么巴尼也是弗雷德的朋友。

输入
输入文件包含多个测试用例。
每个案例的第一行表示测试友谊巢的数量。
每个友谊巢都以一行包含整数F的行开始,F是在这个友谊巢中形成的友谊的数量,不超过100,000。下面每一行都包含了刚刚成为朋友的两个人的名字,中间用空格隔开。名称是由1到20个字母(大写或小写)组成的字符串。

输出
每当一段友谊形成时,打印一行包含一个整数的行,即两个人在社交网络中刚刚成为朋友的人数。

#include <cstdio>
#include <cstring>
#include <map>
#define m(a,b) memset(a,b,sizeof a)
typedef long long ll;
using namespace std;
const int N=200005;
const int INF=0x3f3f3f3f;
int f[N],num[N];
template<class T>void rd(T &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9')  {f|=(ch=='-');ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return;
}
int seek(int x)
{
    if(x==f[x])
        return x;
    return f[x]=seek(f[x]);
}
map<string,int>mmp;
int main() {
    int T;
    char s1[25],s2[25];
    while(~scanf("%d",&T)) {
        while(T--) {
            int m,cnt=0;
            rd(m);
            for(int i=1; i<N; i++)
                f[i]=i,num[i]=1;
            mmp.clear();
            while(m--) {
                scanf("%s%s",s1,s2);
                if(!mmp[s1])
                    mmp[s1]=++cnt;
                if(!mmp[s2])
                    mmp[s2]=++cnt;
                int a=mmp[s1],b=mmp[s2];
                int ra=seek(a),rb=seek(b);
                if(ra!=rb)
                    f[ra]=rb,num[rb]+=num[ra];
                printf("%d\n",num[rb]);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值