您的位置:首页 > 其它

hdu 3172 virtual friends 并查集

2013-05-08 23:31 483 查看
题意很简单就是告诉你一些话,然后就是说这两个人刚成为好朋友,然后问你就是到每句话的这两个人的朋友网里面有多少人。这个题目的输入比较麻烦啊,tle好几次。解法就是每读入一条边就用并查集的思想,修改祖先节点,然后修改包括祖先的朋友网的大小,然后输出祖先节点的朋友网的规模就可以了。

#include<iostream>
#include<stdio.h>
#include<string>
#include<map>
using namespace std;
map<string,int> A;
int father[100005],sum[100005];
int find_ant(int n)
{
if(n!=father
)
father
=find_ant(father
);
return father
;
}
void unin(int x,int y)
{
x=find_ant(x);
y=find_ant(y);
if(x!=y)
{
father[x]=y;
sum[y]=sum[y]+sum[x];
}
}
int main()
{
int t,n,total;
string a,b;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
cin>>n;
total=0;
A.clear();
while(n--)
{
cin>>a>>b;
if(A.find(a)==A.end())
{
total=total+1;
A[a]=total;
father[total]=total;
sum[total]=1;
}
if(A.find(b)==A.end())
{
total=total+1;
A[b]=total;
father[total]=total;
sum[total]=1;
}
unin(A[a],A[b]);
int ans=find_ant(A[b]);
printf("%d\n",sum[ans]);
}
}
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: