poj 2236 加点 然后判断某两点是否连通

题目大意:
给你N台电脑,从1-N。一个数字,表示两台计算机的最大通信距离,超过这个距离就无法进行通信。然后分别告诉这些电脑的坐标,接下来有两种操作,第一种O表示这点电脑修好,第二种S,表示测试这两台电脑能不能进行正常的通信

修电脑就是把这点加入到图中,S 就是判断这两个结点在不在同一个集合里,也就是是否连通

Sample Input

4 1 //n d
0 1 // x y
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4
Sample Output

FAIL
SUCCESS

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <cmath>
 6 # include <queue>
 7 # define LL long long
 8 using namespace std ;
 9
10 const int MAXN=1010;
11 int F[MAXN] ;
12 int x[MAXN] ;
13 int y[MAXN] ;
14 int v[MAXN] ;
15 int n , d ;
16 int find(int x) //找x的祖先结点
17 {
18     while(x!=F[x])
19         x=F[x];
20      return x;
21 }
22 void bing(int u,int v)
23 {
24     int t1=find(u);
25     int t2=find(v);
26     if(t1!=t2) //这两个点不在一个集合里
27       F[t1]=t2; //合到一个集合里
28 }
29
30 bool dist(int a , int b)
31 {
32     int t1 = x[a] - x[b] ;
33     int t2 = y[a] - y[b] ;
34     if(t1*t1 + t2*t2 <= d*d)
35         return 1 ;
36     else
37         return 0 ;
38 }
39
40 int main()
41 {
42     //freopen("in.txt","r",stdin) ;
43     cin>>n>>d ;
44     int i ;
45     for (i = 1 ; i<= n ; i++)
46         cin>>x[i]>>y[i] ;
47     for (i = 1 ; i<= n ; i++)
48     {
49         F[i] = i ;
50         v[i] = 0 ;
51     }
52     char c ;
53     int t ;
54     while(cin>>c)
55     {
56         if (c == ‘O‘)
57         {
58             cin>>t ;
59             v[t] = 1 ;
60             for (i = 1 ; i<= n ; i++)
61             {
62                 if (i != t && v[i] && dist(i,t))
63                     bing(i,t) ;
64             }
65         }
66         if (c == ‘S‘)
67         {
68             int u , v ;
69             cin>>u>>v ;
70             int t1=find(u);
71             int t2=find(v);
72             if(t1!=t2) //不连通
73                 cout << "FAIL" << endl;
74             else
75                 cout << "SUCCESS" << endl;
76         }
77     }
78
79
80     return 0;
81 }

时间: 2024-10-05 05:07:40

poj 2236 加点 然后判断某两点是否连通的相关文章

poj 2236:Wireless Network(并查集,提高题)

Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 16065   Accepted: 6778 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computer

POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集

POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y均能C通信,则x和y可以通信.现在给出若干个操作, O p 代表修复编号为p的电脑 S p q代表询问p和q是不是能通信. 思路: 并查集即可.. 如果修复了一台电脑,则把与它相连距离不超过d的且修复了的放在一个集合里面. #include<cstdio> #include<cstring&

poj 1410 线段相交判断

http://poj.org/problem?id=1410 Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11329   Accepted: 2978 Description You are to write a program that has to decide whether a given line segment intersects a given rectangle. An ex

poj 1056 Trie树判断哈夫曼编码是否合法

理解了Trie树然后就能1A   其实估计这个题随便做做就能A掉,可能不需要高级数据. 先贴吉林大学的代码模板 /*==================================================*| Trie树(k叉) | INIT: init(); | 注: tree[i][tk]>0时表示单词存在, 当然也可赋予它更多含义; \*==================================================*/ const int tk = 26,

[并查集] POJ 2236 Wireless Network

Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 25022   Accepted: 10399 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap compute

POJ 1269 Intersecting Lines(判断直线相交)

题目地址:POJ 1269 直接套模板就可以了...实在不想自己写模板了...写的又臭又长....不过这题需要注意的是要先判断是否有直线垂直X轴的情况. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h>

sdut Thrall’s Dream(判断任意两点是否联通)

题意:给一张无向图,判断任意两点是否联通: 思路:bfs枚举个点,逐个遍历: #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; int con[2005][2005]; vector<short> v[2005]; int n,m; int judge() { int

POJ 1986 Distance Queries LCA树上两点的距离

题目来源:POJ 1986 Distance Queries 题意:给你一颗树 q次询问 每次询问你两点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + dis(root,v) - 2*dis(roor,LCA(u,v)) 求最近公共祖先和dis数组 #include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn =

poj 3335 /poj 3130/ poj 1474 半平面交 判断核是否存在 / poj1279 半平面交 求核的面积

1 /*************** 2 poj 3335 点序顺时针 3 ***************/ 4 #include <iostream> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 const double eps = 1e-8; 9 const double maxn = 0x7f7f7f7f; 10 int dcmp(double x){ 11 if(fabs(