并查集-2

来源:互联网 发布:ons模拟器mac版 编辑:程序博客网 时间:2024/04/29 08:49

题目描述:

一场地震在东南亚发生了。不幸的是ACM组织通过计算机简历的无线网络遭到毁灭性的影响———网络中所有的计算机都损坏了。在经过维修之后,无线网络又逐渐开始运作了。由于硬件的制约,每两台计算机只能保持不超过d米的距离,才可以直接进行通信,但是每台计算机又可以作为其他两台计算机通信的中介点。也就是说,如果A计算机与B计算机不在能直接通信的范围内,但是它们可以同时通过与A和B计算机通信的C计算机建立间接的通信关系。

在维修的过程中,维修者可以进行两种操作:维修一台计算机或者检测两台计算机之间是否能够通信,你的任务就是解答每一次的检测操作。

输入:

第一行包含两个整数N和d(1<=N<=1001,0<=d<=20 000),N表示计算机的数量,计算机的编号从1开始到N,d为两台能直接通信的计算机所需保持的距离的最大值。在接下来的N行里。每行包含两个整数x和y(0<=x,y<=10 000),表示N台计算机的坐标,接下来的一系列的输入都比表示维修者的操作,每种操作都是以下两种操作中的一种:

①"O p"(1<=p<=N),表示维修第p台计算机。

②"S p q"(1<=p,q<=N),表示检测p与q计算机是否能够通信。

输出:

对于每组检测操作,若两台计算机能进行通信就输出"SUCCESS",否则输出"FAIL"

样例输入:

4 1

0 1

0 2

0 3

0 4

0 5

O 1

O 2

O 4

S 1 4

O 3

S 1 4

样例输出:

FAIL

SUCCESS

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>int map[1005][1005];//标记可以直接通信的计算机int f[1005];int mul(int x) {return x * x;}int find(int x){if(f[x] != x)f[x] = find(f[x]);return f[x];}void make(int a, int b){int f1 = find(a);int f2 = find(b);if(f1 != f2)f[f2] = f1;}void check(int a, int b){int f1 = find(a);int f2 = find(b);if(f1 == f2){printf("SUCCESS\n");return ;}printf("FAIL\n");}int main(){int n, flag[1005];//flag标记计算机是否完好double d;memset(map, 0, sizeof(map));memset(flag, 0, sizeof(flag));scanf("%d%lf", &n, &d);int x[1005], y[1005], i, j, k;for(i = 1; i <= n; i ++)scanf("%d%d", &x[i], &y[i]);for(i = 1; i <= n; i ++)f[i] = i;for(i = 1; i < n; i ++)for(j = i+1; j <= n; j ++)if(sqrt((double)(mul(x[i]-x[j])+mul(y[i]-y[j]))) <= d){map[i][j] = 1;map[j][i] = 1;}char s[5];int a, b;while(scanf("%s", s) != EOF){if(strcmp(s, "O") == 0){scanf("%d", &a);flag[a] = 1;for(i = 1; i <= n; i ++)if(map[i][a] && flag[i])make(a, i);}else{scanf("%d%d", &a, &b);check(a, b);}}return 0;}


0 0
原创粉丝点击