码迷,mamicode.com
首页 > Web开发 > 详细

POJ 2236 Wireless Network

时间:2014-08-13 12:59:16      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:os   io   for   ar   amp   size   ios   har   

思路详见课本 P 213

思路:直接用并查集,最后看 p 和 q 是否 在一个 集合中 即可。属于同一集合,则 可以通信;否则失败。

 

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000 +100;
int set[maxn];
int xx[maxn];
int yy[maxn];
bool valid[maxn];
int n,d;

int set_find(int d)//路径压缩的 合并树根 的函数
{
	if(set[d]<0)
		return d;
	return set[d]=set_find(set[d]);
}
void join(int x,int y)
{
	x=set_find(x);
	y=set_find(y);
	if(x!=y)//-----------此处这个判断千万不能少,否则在 set_find()函数中,出现死循环(由于节点 自己 指向 自己,找不到 结束条件 (即树根))
		//------------提交会出现runtime error  
		set[x]=y;
}
int in(int i,int p)//判断i 是否在 p的范围内
{
	if(  (xx[i]-xx[p]) * (xx[i]-xx[p]) + (yy[i]-yy[p]) * (yy[i]-yy[p]) <= d*d  )
		return 1;
	return 0;
}
void repair(int p)//修复 p
{
	valid[p]=1;
	int i;
	for(i=1;i<=n;i++) 
		if( valid[i] &&in(i,p) &&i!=p)
			join(i,p);
}
void search(int p,int q) //查看 p  和 q是否 可以 通信
{
	if( set_find(p)==set_find(q) )
		cout<<"SUCCESS"<<endl;
	else
		cout<<"FAIL"<<endl;
}
int main()
{
	memset(set,-1,sizeof(set));
	memset(xx,0,sizeof(xx));
	memset(yy,0,sizeof(yy));
	memset(valid,0,sizeof(valid));
	cin>>n>>d;
	int i;
	for(i=1;i<=n;i++)
		cin>>xx[i]>>yy[i];
	char c;
	while(cin>>c)
	{
		if(c==‘O‘)
		{
			int p;
			cin>>p;
			repair(p);
		}
		else if(c==‘S‘)
		{
			int p,q;
			cin>>p>>q;
			search(p,q);
		}
	}
	return 0;
}






POJ 2236 Wireless Network,布布扣,bubuko.com

POJ 2236 Wireless Network

标签:os   io   for   ar   amp   size   ios   har   

原文地址:http://www.cnblogs.com/bofengyu/p/3909737.html

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