hdu3172

题意:每输入两个名字,就代表这两个人认识,且输出这两个人认识的人的个数
字符串版的并查集,一开始不会用C++标准库的map,只用查找字符串,后来发现
一定超时,然后去找了一下map的用法,顺利ac
962ms代码,可以继续优化的,不过后面还有很多题还没a,还是先搞一下后面的

 

#include<iostream>
#include<string>
#include<map>
using namespace std;
typedef struct charter
{
long int father;
long int h;
}person;
person bin[100005];
long int find(long int x)
{
while(x!=bin[x].father)
x=bin[x].father;
return x;
}
int merge(long int x,long int y)
{
long int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy)
{
if(bin[fx].h>=bin[fy].h)
{
bin[fy].father=fx;
bin[fx].h+=bin[fy].h;
}
else
{
bin[fx].father=fy;
bin[fy].h+=bin[fx].h;
}
}
return 0;
}
int main()
{
long int i,t,n,newer,j,x,y,fx,fy;
char a[100],b[100];
while(scanf("%ld",&t)!=EOF)
{
while(t--)
{
map<string,long int> name;
scanf("%ld",&n);
for(i=0;i<=100000;i++)
{
bin[i].father=i;
bin[i].h=1;
}
int id=1;
for(i=0;i<n;i++)
{
scanf("%s %s",a,b);
if(name[a]==0)
{
name[a]=id++;
}
if(name[b]==0)
{
name[b]=id++;
}
x=name[a];
y=name[b];
fx=find(x);
fy=find(y);
if(fx!=fy)
{
printf("%ld\n",bin[fx].h+bin[fy].h);
merge(fx,fy);
}
else
{
printf("%ld\n",bin[fx].h);
}
}
}
}
return 0;
}

 

你可能感兴趣的:(字符串,include)