poj 2236 Wireless Network (并查集)

弄了一下午,终于把这个也弄AC了。

刚开始想修好一个后和已知的循环求距离然后合并,一想担心时间肯定不够,然后又看了网上的阶梯报告,结果就是这样,悲哀呀            (ˇˍˇ)  回头一看题目时间是10000MS。。。 

 

#include "iostream" #include "stdio.h" #include "cmath" using namespace std; struct point { unsigned int x,y; int set; }r[1003]; int make(int n) { int i; for(i=0; i<=n; i++) r[i].set=i; } int find(int x) { if(x!=r[x].set) r[x].set=find(r[x].set); return r[x].set; } int Union(int rx,int ry) { if(rx==ry) return 0; r[ry].set=rx; } int main() { int i,j,x,y,e,oc,m,d,n; int a,b,rx,ry; double dis; int hasre[1003]; char c; scanf("%d%d",&n,&d); make(n); for(e=1; e<=n; e++) scanf("%d%d",&r[e].x,&r[e].y); oc=1; while(scanf("/n%c %d",&c,&a)!=EOF) { if(c=='O') { hasre[oc++]=a; for(j=1; j<oc; j++) { dis=(r[hasre[j]].x-r[a].x)*(r[hasre[j]].x-r[a].x)+ (r[hasre[j]].y-r[a].y)*(r[hasre[j]].y-r[a].y); // cout<<"dis="<<dis<<endl; if(dis<=d*d) { rx=find(a); ry=find(hasre[j]); Union(rx,ry); } } } else { scanf("%d",&b); rx=find(a); ry=find(b); if(rx==ry) printf("SUCCESS/n"); else printf("FAIL/n"); } } system("pause"); return 0; }

 

 

 

 

你可能感兴趣的:(c,System,NetWork,iostream)