Virtual Friends HDU - 3172(并查集)

现在,你可以在网上做各种事情。例如,您可以使用各种网站来结交虚拟朋友。对一些人来说,发展他们的社交网络(朋友、朋友的朋友、朋友的朋友等)已经成为一种上瘾的爱好。就像有些人集邮一样,其他人也集邮虚拟朋友。              

你的任务是观察这样一个网站上的互动,并跟踪每个人的网络规模。              

假设每一种友谊都是相互的。如果弗雷德是巴尼的朋友,那么巴尼也是弗雷德的朋友。              

输入              

输入文件包含多个测试用例。              

每个案例的第一行指示测试友谊嵌套的数量。              

每一个友谊巢都以一个整数f开头,即在这个友谊巢中形成的友谊数,不超过100000。下面的每一行F都包含两个刚成为朋友的人的名字,用空格隔开。名称是由1到20个字母(大写或小写)组成的字符串。              

输出              

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

1
3
Fred Barney
Barney Betty
Betty Wilma

Sample Output

2
3
4

这道题目最后是问刚刚输入的这两个人,进到一个团体中(如果是一开始的话,团体是0人;如果不是一开始,里面肯定是有人的,看看刚刚输入的这两个人在这个团体里面能形成几个新的朋友关系,这里有可能没有读懂题目的意思,不知道怎么来做),题目给出的是字符串的数据,那我们就将这个字符串转化为数字,使用map<string,int>mp 将字符串转化为数字,然后就是带权并查集。

代码:

 还有个坑点,使用G++交,各种错误,一开始为TLE ,后来是OLE ,后来是WA,一交C++就过了


#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>


const int maxn=100010;

using namespace std;

int num;
int pre[maxn];
int sum[maxn];

void init()
{
	for(int i=1;i<=maxn;i++)
	{
		pre[i]=i;
		sum[i]=1;
	}	
	
}

int find(int x)
{
	return x==pre[x]?x:pre[x]=find(pre[x]);
}

void join(int x,int y)
{
	int a=find(x);
	int b=find(y);
	if(a!=b)
	{
		pre[a]=b;
		sum[b]+=sum[a];
	}
}


int main()
{
	
	int t;
	while(scanf("%d",&t)!=EOF)
	{
		while(t--)
		{
			string a,b;
			map<string,int>mp;
			int tot=0;
			scanf("%d",&num);
			init();
			for(int i=0;i<num;i++)
			{	
				
					cin>>a>>b;
					if(!mp[a])
						mp[a]=++tot;
					if(!mp[b])
						mp[b]=++tot;
					join(mp[a],mp[b]);
					int k=find(mp[a]);
					printf("%d\n",sum[k]);	
				
			}
				
			
		}
	}
	
	
	
	
	
	return 0;
}






发布了123 篇原创文章 · 获赞 83 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/tsam123/article/details/89365158