hdu 3172(并查集+hash)
解题思路:典型的并查集,只是每个人的名字要转换成数字,可以用map,也可以用字典树,我最开始用的字典树结果爆内存了。。
爆内存:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 200000;
int n,fa[maxn],trie[maxn][52],cnt,id[2000000],num;
int tot[maxn];
char str[2][20];void init()
{for(int i = 0; i <= 2*n; i++){fa[i] = i;tot[i] = 1;}memset(id,-1,sizeof(id));memset(trie,-1,sizeof(trie));cnt = num = 0;
}int insert(char *s)
{int p = 0,idx;while(*s != 0){if(*s >= 'A' && *s <= 'Z') idx = *s - 'A' + 26;else idx = *s - 'a';if(trie[p][idx] == -1)trie[p][idx] = ++cnt;p = trie[p][idx];s++;}if(id[p] == -1)id[p] = ++num;return id[p];
}int find(int x)
{if(fa[x] == x) return x;return fa[x] = find(fa[x]);
}int main()
{int t,x,y,fx,fy;scanf("%d",&t);while(t--){scanf("%d",&n);init();for(int i = 1; i <= n; i++){scanf("%s %s",str[0],str[1]);x = insert(str[0]);y = insert(str[1]);fx = find(x); fy = find(y);if(fx != fy){fa[fy] = fx;tot[fx] += tot[fy];}printf("%d\n",tot[fx]);}}return 0;
}
别人的:
#include<stdio.h>
#include<map>
#include<iostream>
using namespace std;
map<string,int> m;
int set[100005];
int num[100005];
int find(int x)
{int r=x;while(r!=set[r])r=set[r];int i=x;while(i!=r){int j=set[i];set[i]=r;i=j;}return r;
}
void merge(int x,int y)
{int fx=find(x);int fy=find(y);if(fx!=fy){set[fx]=fy;num[fy]+=num[fx];printf("%d\n",num[fy]);}else{printf("%d\n",num[fy]);}
}
int main()
{int t;char a[25];char b[25];while(scanf("%d",&t)!=EOF){while(t--){int n;scanf("%d",&n);for(int i=1;i<100005;i++){set[i]=i;num[i]=1;}m.clear();int ans=1;for(int i=1;i<=n;i++){scanf("%s%s",a,b);if(!m[a]){m[a]=ans++;}if(!m[b]){m[b]=ans++;}merge(m[a],m[b]);}}}return 0;
}
hdu 3172(并查集+hash)相关推荐
- hdu 5606(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5606 解题思路: 这题实际上是要找一些连通的节点,使得边上的权值都为0. 很明显,首先把权值为0的边都 ...
- HDU 5441并查集 by cyl
HDU 5441 题意: 杰克喜欢旅游,从城市a到城市b是他最喜欢的,现在有n个城市m个路. 当杰克在从城市a到城市b 的时候需要坐车,但是需要有等待时间t,他无法忍受超过x 的等待时间. ...
- hdu 1232 并查集
并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) ...
- hdu 4907(并查集)
Task schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pr ...
- hdu 2473(并查集+删除操作)
解题思路:这道题有并查集的删除操作,如果直接对这一棵树进行删除节点操作肯定是很困难的.所以可以建立虚拟节点,只要有一个节点要被删除,就直接把它投影到虚拟节点上,即用这个虚拟节点来代替我们要删除的节点. ...
- hdu 3081(并查集+最大流)
题目大意: n个男孩n个女孩,女孩选男孩,每个女孩都要选到不同的人 k对女孩有相同选择标准, 女孩每轮都选择没选过的男孩, 问总共能选几轮.解题思路:女孩编号1......n,男孩编号n+1,n+2, ...
- hdu 5441 (并查集)
题意:给你n个点,m条边构成无向图.q个询问,每次一个值,求有多少条路,路中的边权都小于这个值 a->b 和 b->a算两种 思路:把权值从小到大排序,询问从小到大排序,如果相连则用并查集 ...
- hdu 2545 并查集
题目描述:给定一个无向图,判断这个图是否满足任意两点之间有且仅有一条通路. 思路:并查集,若a和b之间有一条边且处于不同的集合中,则将a和b所在集合合并:若a和b本就在同一集合中(有一条通路),则加上 ...
- hdu 1856 并查集——ac的不一定正确
这次深深体会到ac的代码不一定正确.呵呵.cry_mas前一段才和我说起.我还半信半疑.话说好久以前他就说过类似的话,当时水平太菜了.现在深深体会到ac的代码不一定正确.这要坑死了啊,正式比赛碰到真是 ...
最新文章
- 推荐 查公司信息的一个网站
- mysql 织梦 索引_Mysql索引详解 建立索引的优势劣势以及索引规范
- Python知识图谱
- LeetCode算法题-Valid Palindrome II(Java实现)
- docker安装、启动mongo
- PADS2007库转换为PADS 9.0以上库文件
- 关于微信H5自动播放视频-canvas实现逐帧动画效果加音频
- 前端常见的浏览器兼容性问题及解决方案
- 人工智能终将自我进化?排除无用功能,让自己更加完美?
- 三网快速充值话费通道源码
- python任务栏通知区域_PyQT实现通知区域图标和对话气泡
- 服务器机柜与网络机柜
- Google登录接入
- 20155318 《Java程序设计》实验四 (Android程序设计)实验报告
- SLAM学习笔记《Past, Present, and Future of Simultaneous Localization and Mapping: Toward the Robust-Per》
- 简述需求评审的目的、主要内容、主要参加人员.
- PC流氓软件卸载神器Geek Uninstaller
- ZK Studio 1.0 发布新功能
- day03【List、Set】
- 信息系统项目管理师教程读书笔记(八)