HDU 并查集 - 3172 Virtual Friends
2015-05-22 19:05
344 查看
并查集题目,并的意思就是将两个不同类别的集合合并到一起,类似于两棵树合并;查的意思就是找到这个点所属集合的根节点。基本上并查集题目都是在大体架构上面加一些东西即可。并查集代码模板在这里点击打开链接。
这一题为了找到输入的两个人组成的社交网络人数,也就是统计这两个人与前面的人组成的集合中有多少元素。我们加一个辅助数组sum,当两个集合并时,我们将父节点对应下标的sum值加上子节点的sum值,表达这个集合有多少元素。
这一题为了找到输入的两个人组成的社交网络人数,也就是统计这两个人与前面的人组成的集合中有多少元素。我们加一个辅助数组sum,当两个集合并时,我们将父节点对应下标的sum值加上子节点的sum值,表达这个集合有多少元素。
#include<stdio.h> #include<iostream> #include<string> #include<map> using namespace std; #define MAX 100000 int total; map<string,int>A; int pa[MAX],sum[MAX]; int find_set(int x){ if(x==pa[x]) return x; pa[x]=find_set(pa[x]); return pa[x]; } void union_set(int x,int y){ x = find_set(x); y = find_set(y); if(x!=y){ pa[x]=y; sum[y]+=sum[x]; } } int main(){ int n,m; string a,b; while(scanf("%d",&n)!=EOF){ while(n--){ total=0; A.clear(); scanf("%d",&m); while(m--) { cin>>a>>b; if(A.find(a)==A.end()) { total++; A[a]=total; pa[total]=total; sum[total]=1; } if(A.find(b)==A.end()) { total++; A[b]=total; pa[total]=total; sum[total]=1; } union_set(A[a],A[b]); int ans=find_set(A[a]); printf("%d\n",sum[ans]); } } } }
相关文章推荐
- HDU 3172 Virtual Friends(并查集)
- hdu 3172 Virtual Friends(简单并查集)
- HDU 3172 Virtual Friends (并查集)
- HDU 3172 Virtual Friends (并查集)
- HDU 3172 Virtual Friends 带权并查集 -秩
- hdu 3172 Virtual Friends(加权并查集)
- HDU 3172 并查集-Virtual Friends
- HDU - 3172 Virtual Friends(并查集)
- HDU 3172 Virtual Friends(带权并查集)
- hdu 3172 Virtual Friends(并查集)University of Waterloo Local Contest 2008.09
- HDU 3172 Virtual Friends(带权并查集,map)
- hdu 3172 Virtual Friends(并查集,字典树)
- hdu 3172 Virtual Friends (并查集)
- HDU 3172 Virtual Friends (并查集节点统计)
- HDU 3172 Virtual Friends (并查集与map的运用,同HDU1829)
- 并查集 HDU 3172 Virtual Friends
- hdu 3172 Virtual Friends (并查集 + 字典树)
- hdu 3172 Virtual Friends(并查集)
- hdu 3172 virtual friends 并查集
- hdu 3172 Virtual Friends