Description:
Input:
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
题意:发生了一次地震,网络系统瘫痪,那么现在就需要ACMer来修理网络了,有n个网络点,我们知道它们所在的位置,我们只能进行两次操作,一个是修理这个网络,一个是检查两个网络点是否可以联系,可以联系有两种情况:
1.两个网络点都被修理了,且两个点可以直接进行联系(两点距离小于d);
2.两个网络点不能直接联系但是可以间接联系,前提是这些间接性的点都是被修理过的。
#include<stdio.h> const int N=1010; int f[N], vis[N], n; ///vis数组标记该网络点是否被修理过 void Init() { int i; for (i = 0; i < n; i++) { vis[i] = 0; ///一开始网络点都是坏的 f[i] = i; } } int Find(int x) { if (f[x] != x) f[x] = Find(f[x]); return f[x]; } int main () { int D, a[N], b[N], d, i, x, y, p, q; char s[10]; scanf("%d%d", &n, &D); Init(); for (i = 1; i <= n; i++) scanf("%d%d", &a[i], &b[i]); while (scanf("%s", s) != EOF) { if (s[0] == ‘O‘) { scanf("%d", &x); vis[x] = 1; for (i = 1; i <= n; i++) { p = Find(x); q = Find(i); d = (a[x]-a[i])*(a[x]-a[i]) + (b[x]-b[i])*(b[x]-b[i]); if (d <= D*D && vis[i] && p != q) ///如果两个点都被修理过且距离小于D,那就把它们放在一个集合中,代表可以联系了 f[p] = q; } } else { scanf("%d%d", &x, &y); p = Find(x); q = Find(y); if (p == q && vis[x] && vis[y]) printf("SUCCESS\n"); ///那么判断两个点是否可以联系只需要判断它们是否在一个集合就行了 else printf("FAIL\n"); } } return 0; }
原文:http://www.cnblogs.com/syhandll/p/4843804.html