POJ 2236 Wireless Network 并查集

来源:互联网 发布:adobe muse cc 知乎 编辑:程序博客网 时间:2024/05/16 01:19

题意:地震之后所有的电脑之间的通讯都断了,给定n电脑的坐标,然后给一些修复操作,和一些询问。如果两台电脑之间的距离不超过d就能互相通讯。询问是否连通。

思路:最多大概2*1e7次循环,这个还真没想到,所以直接用并查集暴力一个一个的扫,把已修好的全部判断一遍看距离是否小于d,加入集合就行了。

#include<cstdio>#include<cmath>#include<cstring>const int maxn = 1010;int f[maxn],a[maxn];int vis[maxn];double dist[maxn][maxn];struct P{int x,y;}p[maxn];int Find(int x){if(f[x]==x)return x;else return f[x]=Find(f[x]);}void merge(int x,int y){int xx=Find(x);int yy=Find(y);if(xx!=yy)f[xx]=yy;}double dis(int i,int j){double a=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));return a;}int main(){int n,d;//freopen("in.txt","r",stdin);scanf("%d%d",&n,&d);int x,y;for(int i=1;i<=n;i++)f[i]=i;memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y);for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){double t=dis(i,j);dist[i][j]=t;dist[j][i]=t;}}char op[2];while(~scanf("%s",op)){int x,y;if(op[0]=='O'){scanf("%d",&x);vis[x]=1;for(int i=1;i<=n;i++)if(x!=i&&vis[i]&&dist[x][i]<=(double)d){merge(x,i);}}else if(op[0]=='S'){scanf("%d%d",&x,&y);if(Find(x)==Find(y))printf("SUCCESS\n");elseprintf("FAIL\n");}}}