poj 2236 Wireless Network 【并查集】
Time Limit: 10000MS | Memory Limit: 65536K | |
Total Submissions: 16832 | Accepted: 7068 |
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
注意要区分修过的和没修过的
代码:
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> using namespace std; #define M 1005 #define LL __int64 struct node{ int x, y; }s[M]; int map[M][M], fat[M], vis[M]; int f(int x){ if(fat[x] != x) fat[x] = f(fat[x]); return fat[x]; } int main(){ int n, d; scanf("%d%d", &n, &d); int i, j; d*=d; for(i = 1; i <= n; i ++){ scanf("%d%d", &s[i].x, &s[i].y); map[i][i] = 0; for(j = i-1; j> 0; j --){ map[j][i] = map[i][j] = (s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y); // printf("%d..map(%d, %d)\n", map[i][j], i, j); } } char ss[2]; int a, b; memset(vis, 0, sizeof(vis)); for(i = 1; i <= n; i++) fat[i] = i; while(scanf("%s", ss) == 1){ if(ss[0] == 'O'){ scanf("%d", &a); vis[a] = 1; for(i = 1; i <= n; i ++){ if(vis[i]&&map[a][i] <= d&&i != a){ int x = f(a); int y = f(i); if(x != y) fat[x] = y; } } } else{ scanf("%d%d", &a, &b); int x = f(a); int y = f(b); if(vis[a]&&vis[b]&&x == y) printf("SUCCESS\n"); else printf("FAIL\n"); } } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。