Description
In the process of repairing the network, workers can take two kinds of operations at every moment, repairing a computer, or testing if two computers can communicate. Your job is to answer all the testing operations.
Input
1. "O p" (1 <= p <= N), which means repairing computer p.
2. "S p q" (1 <= p, q <= N), which means testing whether computer p and q can communicate.
The input will not exceed 300000 lines.
Output
Sample Input
4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1 4 O 3 S 1 4
Sample Output
FAIL SUCCESS
---------------------------------------
題意 :給一些電腦的座標,有兩種操作 'O p'即修復p點 'S p q'詢問p,q的是否連通;
連通的條件是:兩點之間的距離小於d,或者可以通過中間節點連接;並且兩點都是修復過的;
思路:判斷當前修復好的節點(是一個只有一個節點的連通分量),和之前修復好的節點(要遍歷修復好的所有的節點)之間的距離D ,如果D<=d,那麼就將此分量和之前節點所在的連通分量並在一起;
#include<stdio.h> #include<string.h> #include<math.h> struct node { int x,y; int pre; }node[1010]; double dou(int x) { return (x)*(x)*1.0; } double distance(int x,int y,int k) { return sqrt(dou(node[k].x - x) + dou(node[k].y - y)); } int find(int k) { while(k!=node[k].pre) k = node[k].pre; return k; } int main() { int n,d; int i,j,k,x; int a[1010];//數組a用於存放所有已修復好的節點; char ch; double tmp=0; while(scanf("%d%d",&n,&d)!=EOF) { memset(node,0,sizeof(node)); for(i=1;i<=n;i++) { scanf("%d%d",&node[i].x,&node[i].y); node[i].pre = 0; } memset(a,0,sizeof(a)); x = 1; getchar(); while(scanf("%c",&ch)!=EOF) { if(ch=='O') { scanf("%d%*c",&k); node[k].pre = k;//表示此點被修復好了 for(j=1;j<x;j++)//和之前修復好的節點進行判斷 { tmp = distance(node[k].x,node[k].y,a[j]); if(tmp<=d*1.0) { int fa1,fa2; fa1 = find(a[j]); fa2 = find(k); if(fa1 != fa2) node[fa1].pre = fa2; } } a[x++] = k; } else if(ch=='S') { int p1,p2; scanf("%d%d%*c",&p1,&p2); if(find(p1)==find(p2)) printf("SUCCESS\n"); else printf("FAIL\n"); } } } return 0; }