hdu3172:Virtual Friends
2015-08-06 15:06
423 查看
蛮简单的并查集
注意 若map中不存在对应的字符串到整数的映射
则默认映射为0
注意 若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; }
相关文章推荐
- Syntagmatic and Paradigmatic Relations 的代码调试
- SqlServerException:拒绝对表对象的select,insert权限解决(新建账号导致的问题)
- Android开发必知--自定义Toast提示
- [转载]Mysql导出表结构及表数据 mysqldump用法
- 洛谷1603 斯诺登的密码
- js的arguments用法
- Populating Next Right Pointers in Each Node II
- 数据可视化
- Linux用户管理实战
- 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort
- 程序员的自由,不只在那一寸领地!
- 通知
- 批处理命令NET
- -[UIKBBlurredKeyView candidateList]: unrecognized selector sent to instance 0x177cc850
- 甘雅思:多空僵持不下,金银弱势震荡(8.6)
- Invert Binary Tree
- iOS UI06_UIPageControl
- ruby中的单例模式
- Spring.Net学习笔记八(方法的注入)
- iOS开发系列--视图切换