首页 > 代码库 > POJ 2236 Wireless Network
POJ 2236 Wireless Network
思路详见课本 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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。