hdu 3172 Virtual Friends(带权并查集)

题意:给你f个关系,每个关系有两个人名,表示互相认识。

求每一次的输出,输出有多少个人刚刚成为朋友。(如果没有新的朋友加入,则输出原来的人数)

注意:输入格式巨坑,需要这样

while(scanf("%d",&case)!=EOF){
  while(case--){}
}

测试数据如下:

1
7
a b
a a
a c
c g
g h
n n
h n
ans:
2
2
3
4
5
1
6

遇到了玄学问题(╯﹏╰)

#include<stdio.h>
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
#define MAXN 100000+10
int pre[MAXN],num[MAXN];
int n;
int ans=0;
void init(int n){
    ans=0;
    for(int i=1;i<MAXN;i++){//MAXN  变为 2*n 会 TE 不懂 
        pre[i]=i;
        num[i]=1;
    }
}
int find(int x){
    if(x==pre[x])
    return x;
    int px = find(pre[x]);
    num[x]+=num[pre[x]];
    return pre[x]=px;
}
void merge(int x,int y){
    int xx=find(x);
    int yy=find(y);
    if(xx!=yy){
        pre[yy]=xx;
        num[xx]+=num[yy];
    }
    ans=num[xx];
}
map<string,int>mp;
int main(){
    int t;
    while(scanf("%d",&t)!=EOF){
        while(t--){
            mp.clear();
            scanf("%d",&n);
            int id=1;
            init();
            while(n--){
                int a,b;
                char str[15],str1[15];
                scanf("%s%s",str,str1);
                if(mp[str]==0)
                mp[str]=id++;
                if(mp[str1]==0)
                mp[str1]=id++;
                merge(mp[str],mp[str1]);
                printf("%d\n",ans);
            }    
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值