题意:人与人交友构成关系网,两个人交友,相当于两个朋友圈的合并,问每个出两人,他们目前所在的关系网中的人数。

分析:用并查集,其实就是求每个集合当前的人数。对于人名的处理用到了字典树。

注意:1、题目给出的n是指n对关系,上限有2*n个人。

    2、题目很没有意思的既说了有多组数据,又要求输入组数。实际上还是多组数据。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int MAXN=; struct Node{
int c;
Node *child[];
Node(){
c=;
for(int i=;i<;i++)
child[i]=NULL;
}
}*root; int cnt;
int p[MAXN],num[MAXN];
char str1[],str2[]; void init(int n)
{
root=new Node();//
cnt=; for(int i=;i<n;i++)
{
p[i]=i;
num[i]=;
}
} int ID(char str[])
{
Node *p=root;
int len=strlen(str);
for(int i=,k;i<len;i++,p=p->child[k])
{
if(str[i]>='a'&&str[i]<='z')
k=str[i]-'a';
else
k=str[i]-'A'+;
if(p->child[k]==NULL)
p->child[k]=new Node();
}
if(p->c)
return p->c;
return p->c=++cnt;//
} int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
} int main()
{
int T,n;
while(~scanf("%d",&T))
{
while(T--)
{
scanf("%d",&n); init(n*);//
for(int i=;i<n;i++)
{
scanf("%s%s",str1,str2);
int u=ID(str1);
int v=ID(str2); int fu=find(u);
int fv=find(v); if(fu==fv)
printf("%d\n",num[fu]);
else {
p[fv]=fu;
num[fu]+=num[fv];
printf("%d\n",num[fu]);
} }
}
}
return ;
}

最新文章

  1. Linux 定时任务
  2. 【java基础】成员变量和局部变量02
  3. 非阻塞同步算法实战(三)-LatestResultsProvider
  4. 在IE6、IE7中实现块元素的inline-block效果
  5. C++静态成员和静态成员函数
  6. EFS解密----未重装系统
  7. Maven创建servlet项目演示(三)
  8. Unable to find the wrapper &quot;https&quot;错误的解决办法
  9. [转]Posix-- 互斥锁 条件变量 信号量
  10. 使用netcat进行反弹链接的shellcode
  11. phpcms v9后台多表查询分页代码
  12. 阿里云OS和Android的关系(本文转载月光博客)
  13. 杭州网赛 two rabbits (hdu 4745)
  14. Java面试题之一
  15. copy与mutableCopy的区别总结
  16. vue-cli webpack配置 简单分析
  17. python-进程池与线程池,协程
  18. 2079 ACM 选课时间 背包 或 母函数
  19. linux space/mark设置
  20. 逆波兰表达式|2013年蓝桥杯A组题解析第六题-fishers

热门文章

  1. 【贪心】Mixing Milk
  2. docker环境准备及理论
  3. sql查询,如果有更新时间则按更新时间倒序,没有则按创建时间倒序排列
  4. CRC(16位)多项式为 X16+X15+X2+1
  5. 写给嵌入式程序员的循环冗余校验(CRC)算法入门引导
  6. 如何使用Delphi编写Modbus RTU CRC16的校验码
  7. Android开发必须知道SERVICE的10件事
  8. leetcode 题解:Merge Sorted Array(两个已排序数组归并)
  9. Exception thrown in catch and finally clause
  10. ImageSwitcher (图像切换器,显示图片)