您的位置:首页 > 其它

hdu3172:Virtual Friends

2015-08-06 15:06 423 查看
蛮简单的并查集

注意 若map中不存在对应的字符串到整数的映射

则默认映射为0

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#define maxn 111111
using namespace std;

int fa[maxn];
char a[maxn][30];
char b[maxn][30];
int big[maxn];

void init()
{
int i;
for(i=0;i<=maxn;i++)
fa[i]=i;
}

int seek(int x)
{
return fa[x]==x?x:fa[x]=seek(fa[x]);
}

void Merge(int u ,int v)
{
int fu = seek(u);
int fv = seek(v);
if(fu != fv) {
fa[fv] = fu ;
big[fu] += big[fv];
big[fv] = 0 ;
}
}

int main()
{
int t,n,i;
map<string,int> cnt;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
init();
//memset(big,1,sizeof(big));

scanf("%d",&n);
cnt.clear();

for(i=0;i<=maxn;i++)
{
//fa[i]=i;
big[i]=1;
}

int tot=1;//一开始赋成了0,则第一个数等于没有映射
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
if(!cnt[a[i]])
cnt[a[i]]=tot++;
//printf("Jesus1\n");

scanf("%s",b[i]);
if(!cnt[b[i]])
cnt[b[i]]=tot++;
//printf("Jesus2\n");

int aa=cnt[a[i]];
int bb=cnt[b[i]];
//printf("Jesus3\n");

Merge(aa,bb);

// printf("Jesus4\n");

int ans=seek(aa);

printf("%d\n",big[ans]);

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