我是靠谱客的博主 害怕音响,最近开发中收集的这篇文章主要介绍POJ1611 并查集,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这个题目是并查集的相对交简单的题目。本人第一词一次提交就ac,鸡冻呀。

将所有的组学生都union到一起,最后找到0号学生所在组的人数输出就可以了。

package test;
import java.util.Scanner;
public class Main {
	static node[] stus = new node[30001];
	public static void main(String args[]) {
		Scanner cin = new Scanner(System.in);
		int n = cin.nextInt();
		int m = cin.nextInt();
		while (n != 0) {
			if (m == 0) {
				System.out.println(1);
			} else {
				init();// 初始化
				while (m > 0) {// 输入每一个组的人员id
					m--;
					int num = cin.nextInt();// 组里的人数
					int x = cin.nextInt();// 输入的第一个元素
					while (num != 1) {
						num--;
						union(x, cin.nextInt());// 本组中的每一个元素都跟x放在同一个组里
					}
				}
				// 查找0号学生所在组的人数
				int sick = stus[find(0)].childnum + 1;
				System.out.println(sick);
			}
			// 下一个case
			n = cin.nextInt();
			m = cin.nextInt();
		}
	}
	public static void init() {
		for (int i = 0; i < stus.length; i++) {
			stus[i] = new node();
			stus[i].childnum = 0;
			stus[i].parent = i;// 初始化每一个元素组成一个集合
		}
	}
	public static int find(int x) {// 查找元素x所在的集合,返回根节点
		if (stus[x].parent == x)
			return x;
		stus[x].parent = find(stus[x].parent);
		return stus[x].parent;
	}
	public static void union(int x, int y) {// 将两个结合合并
		int px = find(x);// x的父亲节点
		int py = find(y);// y的父亲节点
		if (px == py)// 如果x和y本来就是在同一个组里的,不用合并
			return;
		if (stus[px].childnum >= stus[py].childnum) {// 如果x的孩子多,则把y加到x上
			stus[py].parent = px;
			stus[px].childnum += stus[py].childnum + 1;
		} else {// 如果y的孩子多,则把x加到y上
			stus[px].parent = py;
			stus[py].childnum += stus[px].childnum + 1;
		}
	}
	// 初始化统计每个集合都只有1个人
	// 只要是跟X同一个集合的都连上去
	// 最后搜索0属于哪个集合,这个集合有多少人
}
class node {
	int parent;
	int childnum;
}

ps:今天【2012-9-22】再看这段代码的时候,发现里面错了一点。

if (m == 0) {
      System.out.println(n);
} 
当m==0的时候,应该输出的是n的数量,而不仅仅是1。看来这道题的数据量也不是很大。

----------------------------------------------------魂歌----------------------------------------------------

2012-09-28:

今天看了一个百度的笔试题,是集合合并的问题。http://www.yjbys.com/qiuzhizhinan/show-52701.html的第五题。

可以先将字符串编码为数字,比如说aaa对应数字1,bbb对应数字2,以此类推,然后将集合作为数字的集合,按照并查集的思路进行合并,然后再将集合还原成为字符串的集合,根据并查集的结果进行组装就形成了合并之后的结果。

最后

以上就是害怕音响为你收集整理的POJ1611 并查集的全部内容,希望文章能够帮你解决POJ1611 并查集所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部