码迷,mamicode.com
首页 > 其他好文 > 详细

poj2236和poj1611并查集问题

时间:2015-04-01 20:01:00      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

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)
{
    return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);
}

void Init(int n)
{
    for(int i=1;i<=n;i++)
    {
        pre[i] = i;
        rank[i] = 1;
    }
}

int Find(int x)
{
    if(pre[x] != x)
        pre[x] = Find(pre[x]);
    return pre[x];
}

void Union(int x,int y)
{
    x = Find(x);
    y = Find(y);
    if(x == y) return;
    if(rank[x] >= rank[y])
    {
        pre[y] = x;
        rank[x] += rank[y];
    }
    else
    {
        pre[x] = y;
        rank[y] += rank[x];
    }
}

int main()
{
    char ch[5];
    int n,d,x,y;
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&p[i].x,&p[i].y);
    int cnt = 0;
    Init(n);
    while(~scanf("%s",ch))
    {
        if(ch[0] == 'O')
        {
            scanf("%d",&x);
            for(int i=0;i<cnt;i++)
            {
                if(dist(p[repaired[i]],p[x]) <= d*d)
                    Union(repaired[i],x);
            }
            repaired[cnt++] = x;
        }
        else
        {
            scanf("%d%d",&x,&y);
            x = Find(x);
            y = Find(y);
            if(x == y) puts("SUCCESS");
            else       puts("FAIL");
        }
    }
    return 0;
}



poj1611问是:学生0感染病毒,跟他一组的都得病,他可以交叉加入若干组,问一共的病的人数


并查集合并后,遍历查询是否同一集合即可


#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 30010;
int M,N;
typedef struct UF
{
	int par[MAX],rank[MAX];
	void init(){
		for (int i = 0; i <= MAX; ++i)
		{
			par[i]=i;
			rank[i]=1;
		}
	};
	int find(int x){
		if(x!=par[x]){
			par[x]=find(par[x]);
		};
		return par[x];
	};
	int same(int x,int y){
		return find(x)==find(y);
	};
	void unions(int x,int y){
		int xx=find(x);
		int yy=find(y);
		if (xx==yy)
		{
			return ;
		}
		if (rank[xx]<rank[yy])
		{
			par[xx]=yy;
			rank[yy]+=rank[xx];
		}
		if (rank[xx]>=rank[yy])
		{
			par[yy]=xx;
			rank[xx]+=rank[yy];
		}
	};
}UF;
UF uf;
int main(int argc, char const *argv[])
{
	while(scanf("%d%d",&N,&M)&&M&&N){
		uf.init();
		for (int i = 0; i < M; ++i)
		{
			int num,fir;
			scanf("%d",&num);
			scanf("%d",&fir);
			for (int j = 1; j < num ; ++j)
			{
				int tmp;
				scanf("%d",&tmp);
				uf.unions(fir,tmp);
			}
		}
		int sum=1;
		for (int i = 1; i < N; ++i)
		{
			if (uf.same(0,i))
			{
				sum++;
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}


poj2236和poj1611并查集问题

标签:

原文地址:http://blog.csdn.net/ysgcreate/article/details/44811243

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!