【 HDU 3172 Virtual Friends】 并查集+map指针优化
2012-11-04 18:49
441 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3172
题目大意: 找朋友,遇见新朋友就把他们的朋友圈子合并,输出总的朋友数。否则若已经在同一个,则直接输出就行。
解题思路:
明显的并查集,朋友数值需要再开一个数组存储父节点以下圈子人数,不在同一圈子合并就是。
但是敲出代码后你会果断发现TLE。网上很多解题报告也是TLE,赛后的数据藐视加强了很多。
用并查集+map暴搞明显要超时。这里就有点小技巧,对map进行指针优化处理。
题目大意: 找朋友,遇见新朋友就把他们的朋友圈子合并,输出总的朋友数。否则若已经在同一个,则直接输出就行。
解题思路:
明显的并查集,朋友数值需要再开一个数组存储父节点以下圈子人数,不在同一圈子合并就是。
但是敲出代码后你会果断发现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; }
相关文章推荐
- HDU 3172 Virtual Friends 并查集+map
- HDU-3172 Virtual Friends 并查集+map
- 文章标题 HDU 3172 : Virtual Friends (并查集+map)
- hdu 3172 Virtual Friends(并查集+map)
- hdu 3172 Virtual Friends 【并查集+map】
- hdu 3172 Virtual Friends
- hdu 3172 Virtual Friends(并查集)University of Waterloo Local Contest 2008.09
- HDU 3172 Virtual Friends(并查集)
- hdu 3172 Virtual Friends (并查集 + 字典树)
- HDU 3172 Virtual Friends(map+并查集)
- hdu 3172:Virtual Friends
- HDU 3172 Virtual Friends (并查集节点统计)
- hdu 3172 Virtual Friends (map+并查集)
- HDU 3172 Virtual Friends
- HDU - 3172 Virtual Friends(并查集)
- HDU 3172 Virtual Friends(带权并查集)
- HDU 3172 - Virtual Friends(map+并查集)
- hdu 3172 Virtual Friends(map)
- hdu 3172 Virtual Friends
- HDU 3172 Virtual Friends()