您的位置:首页 > 其它

【 HDU 3172 Virtual Friends】 并查集+map指针优化

2012-11-04 18:49 441 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3172

题目大意: 找朋友,遇见新朋友就把他们的朋友圈子合并,输出总的朋友数。否则若已经在同一个,则直接输出就行。

解题思路:

明显的并查集,朋友数值需要再开一个数组存储父节点以下圈子人数,不在同一圈子合并就是。

但是敲出代码后你会果断发现TLE。网上很多解题报告也是TLE,赛后的数据藐视加强了很多。

用并查集+map暴搞明显要超时。这里就有点小技巧,对map进行指针优化处理。

#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn=200005;
int pre[maxn],num[maxn];
char str[maxn][25];

int find(int x)
{
int r=x;
while(pre[r]!=r)
{
r=pre[r];
}
return r;
}

struct cmp
{
bool operator()(const char* s1,const char* s2)const
{
return strcmp(s1,s2)<0;
}
};

int main()
{
int  T, n, fa, fb;
while(cin >> T)
{
while(T--)
{

scanf("%d",&n);
int  cnt=0;
map<char*,int,cmp>M;
for(int i=0; i<=2*n; i++)
{
pre[i]=i;
num[i]=1;
}
int res=0;
for(int i=0; i<n; i++)
{
scanf("%s%s",str[++res],str[++res]);
if(!M[str[res-1]])
M[str[res-1]]=++cnt;
if(!M[str[res]])
M[str[res]]=++cnt;
fa=find(M[str[res-1]]);
fb=find(M[str[res]]);
int ans=0;
if(fa!=fb)
{
num[fa]+=num[fb];
printf("%d\n",num[fa]);
pre[fb]=fa;
}
else printf("%d\n",num[fa]);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: