博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu Virtual Friends
阅读量:6153 次
发布时间:2019-06-21

本文共 2086 字,大约阅读时间需要 6 分钟。

  这题是一个很简单额并查集的题目,首先第一步是要用map将字符串映射为整型,这样方便后面的处理,然后就是用一个rank[]数组来记录每个朋友圈的人数。之后就是简单的并查集操作了。

这里给出一组测试案例:

1

6
Fred Barney
Barney Betty
Betty Wilma
AAAAA BBBBB
AAAA  BBBBB
AAAA Fred

输出结果应是:
2
3
4
2
3
7
代码如下:
#include"iostream"#include"stdio.h"#include"algorithm"#include"string"#include"string.h"#include"cmath"#include"ctype.h"#include"map"#include"vector"#include"queue"#include"stack"using namespace std;const int mx=100005;int num_nest;int F;map
name;int fa[2*mx];int Rank[2*mx];void Set(){ for(int i=0;i<2*F;i++) { fa[i]=i; Rank[i]=1; }}int Find(int x){ int t1,t2=x; while(t2!=fa[t2]) t2=fa[t2]; while(x!=t2)//可以减小时间复杂度 { t1=fa[x]; fa[x]=t2; x=t1; } return t2;}void Union(int x,int y){ int fx=Find(x); int fy=Find(y); if(fx!=fy) { fa[fx]=fy; Rank[fy]+=Rank[fx]; Rank[fx]=Rank[fy]; }}bool is_exist(const string &str)//查找map中是否已存在该元素{ return name.find(str)== name.end();}void IO(){ while(scanf("%d",&num_nest)==1) { while(num_nest--) { string name1,name2; int cnt=0,id1,id2; name.clear(); scanf("%d",&F); Set(); getchar(); while(F--) { cin>>name1; if(is_exist(name1)) { name.insert(pair
(name1,cnt)); id1=cnt; cnt++; } else id1=(name.find(name1))->second; cin>>name2; if(is_exist(name2)) { name.insert(pair
(name2,cnt)); id2=cnt; cnt++; } else id2=(name.find(name2))->second; Union(id1,id2); int fid1=Find(id1); printf("%d\n",Rank[fid1]); } } }}int main(){ IO(); return 0;}
View Code

 

转载于:https://www.cnblogs.com/acm-jing/p/4665802.html

你可能感兴趣的文章
智力大冲浪
查看>>
虚拟机VMware 9安装苹果MAC OSX 10.8图文教程
查看>>
微信小程序开发-框架
查看>>
redo、undo、binlog的区别
查看>>
RecycleView设置顶部分割线(记录一个坑)
查看>>
汉字转拼音 (转)
查看>>
会计基础_001
查看>>
小程序: 查看正在写的页面
查看>>
Jenkins持续集成环境部署
查看>>
MWeb 1.4 新功能介绍二:静态博客功能增强
查看>>
预处理、const与sizeof相关面试题
查看>>
爬虫豆瓣top250项目-开发文档
查看>>
有趣的数学书籍
查看>>
teamviewer 卸载干净
查看>>
eclipse的maven、Scala环境搭建
查看>>
架构师之路(一)- 什么是软件架构
查看>>
USACO 土地购买
查看>>
【原创】远景能源面试--一面
查看>>
B1010.一元多项式求导(25)
查看>>
10、程序员和编译器之间的关系
查看>>