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

杭电ACM1269——迷宫城堡~~并查集

时间:2015-05-16 21:58:06      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:acm   杭电   

这题,可以用并查集来解决。需要用到两个数组来判断从i到j以及j到i的是否属于同一个并查集。

下面的是AC的代码:

#include <iostream>
#include <cstdio>
using namespace std;

int par[2][10005];
int n, m;

int finds(int x, int i)
{
	if(x == par[i][x])
		return x;
	else
		return par[i][x] = finds(par[i][x], i);
}
void join(int x, int y)                      //并查集合并
{
	if(x != n)                           //没有包含第n个放间的两个房间,在0和1的地方都要合并,包含n的特殊处理
	{
		x = finds(x, 0);
		y = finds(y, 0);
		if(x != y)
			par[0][x] = y;
	}
	if(y != n)
	{
		x = finds(x, 1);
		int fy = finds(y, 1);
		if(x != y)
			par[1][y] = x;
	}
}

int main()
{
	int a, b;
	while(scanf("%d%d", &n, &m) != EOF && m + n != 0)
	{
		for(int j = 0; j <= n; j++)
			par[0][j] = par[1][j] = j;
		for(int i = 0; i < m; i++)
		{
			scanf("%d%d", &a, &b);
			join(a, b);
		}
		int flag = 0;
		for(int k = 1; k <= n; k++)                       //并查集合并之后,都是属于第n个,所以判断是否等于n
		{
			if(finds(k, 0) != n || finds(k, 1) != n)
			{
				flag = 1;
				break;
			}
		}
		if(flag)
			cout << "No" << endl;
		else
			cout << "Yes" << endl;
	}
	return 0;
}


杭电ACM1269——迷宫城堡~~并查集

标签:acm   杭电   

原文地址:http://blog.csdn.net/qq_25425023/article/details/45771051

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