您的位置:首页 > 其它

hdu 3172 Virtual Friends(并查集+map)

2014-06-21 13:39 337 查看
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3172
思路:用map建立字符与编号的对应。

注意:

(1)输入while(scanf("%d",&t)!=EOF)

{

while(t--)

{}

}

(2)每次组数据之前map的清零。

(3)map中是否有对字符串a的编号

if(p.find(a)==p.end()) 没找到

#include<cstdio>
#include<string>
#include<map>
using namespace std;
const int num=200005;
int m,fa[num],r[num];
map<string,int> p;
void init()
{
int i;
for(i=0;i<num;i++)
{
fa[i]=i;
r[i]=1;
}
}
int f_fa(int a)
{
if(fa[a]==a)
return a;
return f_fa(fa[a]);
}
void uni(int a,int b)
{
int ra,rb;
ra=f_fa(a);
rb=f_fa(b);
if(ra!=rb)
{
if(r[ra]>r[rb])
{
fa[rb]=ra;
r[ra]+=r[rb];
}
else
{
fa[ra]=rb;
r[rb]+=r[ra];
}
}
}
int main()
{
int t,id;
char a[25],b[25];
//freopen("in.txt","r",stdin);
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
p.clear();
scanf("%d",&m);
id=0;
init();
while(m--)
{
scanf("%s%s",a,b);
if(p.find(a)==p.end())
p[a]=id++;
if(p.find(b)==p.end())
p[b]=id++;
uni(p[a],p[b]);
printf("%d\n",r[f_fa(p[a])]);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: