并查集——poj1611(入门)

传送门:The Suspects

  • 并查集水题

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    const int maxn = 50005;
    int n,m;
    int a[maxn],b,ans;
    int pre[maxn];
    
    void init()
    {
    	for(int i=0;i<n;i++){
    		pre[i] = i;
    	}
    }
    
    int findPre(int x)
    {
         if(pre[x]==x)
            return x;
        else
            return pre[x]=findPre(pre[x]);
    }  
    
    void unite(int x,int y)
    {
    	x = findPre(x);
    	y = findPre(y);
    	if(x==y)	return;
    	pre[y] = x;				//y的上级变为x的祖先节点
    }
    
    int main()
    {
    	while(scanf("%d%d",&n,&m) && !(n==0&&m==0)){
    		init();
    		int num,sum=0;
    		for(int i=0;i<m;i++){
    			scanf("%d",&num);
    			if(num>=1){
    				for(int j=0;j<num;j++){
    					scanf("%d",&a[j]);
    				}
    				for(int j=1;j<num;j++){
    					unite(a[0],a[j]);
    				}
    
    			}
    		}
    		for(int i=0;i<n;i++){
    			if(findPre(i) == pre[0]){
    				sum++;
    			}
    		}
    		printf("%d\n",sum);
    	}
    	return 0;
    }
    
时间: 2024-08-07 04:10:58

并查集——poj1611(入门)的相关文章

poj 2524:Ubiquitous Religions(并查集,入门题)

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23997   Accepted: 11807 Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in findi

并查集 poj1611&amp;poj2492

poj1611 简单题 代码中id记录父节点,sz记录子树规模.一个集合为一棵树. #include <iostream> #include <cstdio> using namespace std; int id[300005]; int sz[300005]; void add(int a, int b) { int i, j; for (i = a; i != id[i]; i = id[i]); for (j = b; j != id[b]; j = id[j]); if

并查集入门

我是看着<啊哈!算法>这本书完成并查集的入门,本想举出另外的栗子,奈何...书上的栗子已经很贴切了. 首先引入一个问题:已知有10个土匪,警方需要需要一点点顺藤摸瓜最后挖出他们各自背后的团伙一锅端,经过一段时间的侦查警方的得到了9条确切线索,分别能说明那两个土匪的归顺关系.那么请问此次行动总共要打掉几个团伙? 输入数据如下: 按照第一行输入人数n,线索数m,接下来的m行输入线索,每行线索如1 2代表1号和2号土匪是一伙的.现提供一组数据以供后续讲解和程序测试: <span style=&

并查集的基本运用 POJ1611

用并查集的情况是在比如 A和B联通  B和C联通那么 ABC联通 这类情况下算某个元素所在集合的元素个数.. 并查集数据结构用数组就行,数组的下标表示相应的一个主体,对应的值表示它的父节点的索引,指向父节点.根节点的值特殊一下就行: 原理:先把所有结点(元素)看成独立的集合,然后按给的条件来合并,合并的过程就是最重要的,结合已知条件,因为并查集是用于A和B联通  B和C联通那么 ABC联通 这类情况下算某个元素所在集合的元素个数   所以合并过程是把2个元素所在集合合并,实际情况就是比如已知AC

并查集题目从入门到入土

2017-09-01 并查集一个神奇的算法 今天我们的s同学想学习一下并查集,就去找了几个水题刷一下... 入门题_1:P2839 畅通工程 畅通工程 就是求联通块的数量,-1就是答案. #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int read(){ int f=1,an=0; char ch=getchar(); while(!('0'<=ch&

hdu1272并查集入门

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 41540    Accepted Submission(s): 12811 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

hdu 1213 并查集入门

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12538    Accepted Submission(s): 6145 Problem Description Today is Ignatius' b

poj2236和poj1611并查集问题

POJ 2236 问在计算机坏了,修复若干,问检测两台是否能连通 #include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 1005; struct Point { int x,y; }; Point p[N]; int repaired[N]; int pre[N],rank[N]; int dist(Point A,Point B) {

并查集初学(3)无间道之并查集 &amp;&amp; POJ2542 &amp;&amp; POJ1611

1.hihocoder上面讲的一道题 无间道之并查集 水题,精髓在于使用map容器进行打标签 #include <cstdio> #include <cstring> #include <iostream> #include <string> #include <map> #include <algorithm> using namespace std; const int maxn=10005; int p[maxn]; map&l