简单的并查集
2013-03-30 15:04
183 查看
[1392] 我们必须向前推进!你要来一包么
时间限制: 1000 ms 内存限制: 65535 K问题描述
现在初中生高中生竟然开始抽烟了,真是太不像话了,不过作为一个无奸不商的烟草商,小白菜已经瞄准这块商机无限的市场了。他知道在某个学校里有n(5 <= n <= 50000)个学生,可人家毕竟是学生,直接询问他抽什么烟不太好,学生们也不愿意说,真烦躁。不过小白菜想到了一个办法,就是每次抓两个人来询问是不是抽同一种烟。每次他都会记下回答是yes的两个学生,一共记了q(2 <= q <= n*(n- 1)/2)对学生。现在小白菜捧着一大堆数据来找你,他不需要知道每个人抽什么烟,只需要知道有几种烟能卖到这个学校,你能解决这个难题吗?
输入
有多组输入,每组数据的开头包含两个整形n(5 <= n <= 50000)和q(2 <= q <= n*(n- 1)/2),接下来跟着q行,每行为两个学生的ID。
输出
对于每组数据,输出共有多少种的烟即可。
样例输入
5 2 1 2 4 5
样例输出
3
可以说是一道简单的并查集,但是我一开始竟然超时了,后来发现原来是没有进行路径压缩,压缩之后才A了
代码实现:
#include<stdio.h> #include<string.h> int a[50001]; int find(int x) { int yuan=x,hou,temp; while(x!=a[x]) { x=a[x]; } hou=x; while(hou!=a[yuan])//路径压缩,开始这一部分是木有的 { temp=yuan; yuan=a[yuan]; a[temp]=hou; } return x; } int main() { int i,n,q,t1,t2,num; while(scanf("%d%d",&n,&q)!=EOF) { num=0; for(i=1;i<=n;i++) a[i]=i; for(i=1;i<=q;i++) { scanf("%d%d",&t1,&t2); t1=find(t1); t2=find(t2); a[t1]=t2; } for(i=1;i<=n;i++) if(a[i]==i) num++; printf("%d\n",num); } return 0; }
相关文章推荐
- (用树结构支持并查集8.2.2)POJ 1703 Find them, Catch them(并查集的简单使用: 判断两个元素是否属于同一集合)
- hdu1558(并查集和简单几何的结合)
- POJ 2236 Wireless Network 简单并查集
- POJ 2524 Ubiquitous Religions (最简单的并查集)
- POJ - 1611 The Suspects(简单并查集)
- POJ2524 Ubiquitous Religions(简单并查集)
- 简单并查集Wireless Network POJ - 2236
- 简单并查集之Wireless Network
- 并查集简单实现
- hdu 1213 How Many Tables(并查集的简单应用)
- poj 1611The Suspects(简单的并查集求集合元素)
- hdu1232&& hdu1213(简单并查集)
- zoj1789The Suspects(简单并查集)
- POJ1611-----并查集简单题
- poj 2524 Ubiquitous Religions(最简单的并查集)
- 5-25 朋友圈 (25分) -- 简单并查集
- POJ 1988 Cube Stacking【并查集的简单应用 堆木块】
- hdoj 1272 小希的迷宫 又一个并查集的简单应用
- 1213 How Many Tables(简单并查集)
- POJ 1258,并查集使用的Kruskal方法简单使用