標籤:vector tor tin clu art 鄰接表 pow 並查集 math
算起來是個並查集問題。
題意是說 有N台電腦。每台電腦能以自身為中心串連D米範圍的電腦。
給出N台電腦座標,針對詢問操作。輸出是否連通。
我用鄰接表格儲存體的,假設兩電腦座標 距離小於他們半徑和,存起來。表明這兩個點能夠連通。
用 online[] 表明是否被修複。 修複之後才幹夠用並查集合并。
修複操作就啟用 online,然後遍曆這個點的鄰接邊,假設也有online 的,就合并。
之後就是針對詢問 輸出。
在一個集合就SUCCESS
#include<cstdio>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<queue>#include<map>#include<stack>#include<iostream>#include<list>#include<set>#include<cmath>#define INF 0x7fffffff#define eps 1e-6using namespace std;int n;double r;vector<int>g[1001];int fa[1001];bool online[1001];struct node{ double x,y;} point[1001];int father(int x){ if(x!=fa[x]) return fa[x]=father(fa[x]);}double getlen(node a,node b){ double len=sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); return len-r;}int main(){ scanf("%d%lf",&n,&r); for(int i=1; i<=n; i++) scanf("%lf%lf",&point[i].x,&point[i].y); for(int i=1; i<=n; i++) fa[i]=i,g[i].clear(); int cot=0; for(int i=1; i<=n; i++) for(int j=i+1; j<=n; j++) { double len=getlen(point[i],point[j]); if(len<=0) { g[i].push_back(j); g[j].push_back(i); } } memset(online,0,sizeof(online)); char str[10]; while(scanf("%s",str)!=EOF) { if(str[0]=='S') { int a,b; scanf("%d%d",&a,&b); if(father(a)!=father(b)) puts("FAIL"); else puts("SUCCESS"); } else if(str[0]=='O') { int u; scanf("%d",&u); online[u]=1; for(int j=0; j<g[u].size(); j++) { int v=g[u][j]; if(!online[v])continue; v=father(v); if(u==v)continue; fa[v]=u; } } }}
POJ 2236 Wireless Network