hdu 3172 Virtual Friends(并查集,字典树)
2024-09-04 14:46:28
题意:人与人交友构成关系网,两个人交友,相当于两个朋友圈的合并,问每个出两人,他们目前所在的关系网中的人数。
分析:用并查集,其实就是求每个集合当前的人数。对于人名的处理用到了字典树。
注意: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 ;
}
最新文章
- Linux 定时任务
- 【java基础】成员变量和局部变量02
- 非阻塞同步算法实战(三)-LatestResultsProvider
- 在IE6、IE7中实现块元素的inline-block效果
- C++静态成员和静态成员函数
- EFS解密----未重装系统
- Maven创建servlet项目演示(三)
- Unable to find the wrapper ";https";错误的解决办法
- [转]Posix-- 互斥锁 条件变量 信号量
- 使用netcat进行反弹链接的shellcode
- phpcms v9后台多表查询分页代码
- 阿里云OS和Android的关系(本文转载月光博客)
- 杭州网赛 two rabbits (hdu 4745)
- Java面试题之一
- copy与mutableCopy的区别总结
- vue-cli webpack配置 简单分析
- python-进程池与线程池,协程
- 2079 ACM 选课时间 背包 或 母函数
- linux space/mark设置
- 逆波兰表达式|2013年蓝桥杯A组题解析第六题-fishers
热门文章
- 【贪心】Mixing Milk
- docker环境准备及理论
- sql查询,如果有更新时间则按更新时间倒序,没有则按创建时间倒序排列
- CRC(16位)多项式为 X16+X15+X2+1
- 写给嵌入式程序员的循环冗余校验(CRC)算法入门引导
- 如何使用Delphi编写Modbus RTU CRC16的校验码
- Android开发必须知道SERVICE的10件事
- leetcode 题解:Merge Sorted Array(两个已排序数组归并)
- Exception thrown in catch and finally clause
- ImageSwitcher (图像切换器,显示图片)