POJ 2236 Wireless Network
题目大意是判断两台电脑是否连通 ,大致思路是利用并查集,将可以直接通信并且完好的电脑划到同一集合中,通过判断两台电脑是否在同一集合就可以知道两台电脑是否可以连通,需要注意的是,必须保证可以通信的每对计算机是完好无损的。
AC code:
1 #include <iostream>
2 #define MAX 1005
3 using namespace std;
4 int map[MAX][MAX];
5 int f[MAX];
6 int mul(int x)//求平方的函数
7 {
8 return x * x;
9 }
10 int find(int x)//并查集
11 {
12 return x == f[x] ? x:f[x] = find(f[x]);
13 }
14 void Union(int a, int b)
15 {
16 int f1 = find(a);
17 int f2 = find(b);
18 if(f1 != f2)
19 f[f2] = f1;
20 }
21 void check(int a, int b)//检查a与b是否连通
22 {
23 int f1 = find(a);
24 int f2 = find(b);
25 if(f1 == f2)
26 {
27 printf("SUCCESS\n");
28 return;
29 }
30 printf("FAIL\n");
31 }
32 int main()
33 {
34 int n, flag[MAX];//flag用于记录电脑是否完好
35 double d;
36 memset(map, 0, sizeof(map));
37 memset(flag, 0, sizeof(flag));
38 scanf("%d%lf", &n, &d);
39 int x[MAX], y[MAX], i, j,k;
40 for(i = 1; i<= n; i++)
41 scanf("%d%d", &x[i], &y[i]);
42 for(i = 1; i <= n; i++)
43 f[i] = i;
44 for(i = 1; i < n; i++)//两重循环标记可以直接通信的两台计算机
45 for(j = i + 1; j <= n; j++)
46 if(sqrt((double)(mul(x[i] - x[j]) + mul(y[i] - y[j]))) <= d)
47 {
48 map[i][j] = 1;
49 map[j][i] = 1;
50 }
51 char s[5];
52 int a, b;
53 while(scanf("%s", s) != EOF)
54 {
55 if(strcmp(s, "O") == 0)
56 {
57 scanf("%d", &a);
58 flag[a] = 1;
59 for(i = 1; i <= n; i++)
60 if(map[i][a] && flag[i])
61 Union(a, i);//将可直接通信的且玩好的计算机合并为同一集合
62 }
63 else
64 {
65 scanf("%d%d", &a, &b);
66 check(a, b);
67 }
68 }
69 return 0;
70 }