码迷,mamicode.com
首页 > 其他好文 > 详细

kuangbin专题五、并查集

时间:2017-04-12 22:54:12      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:size   code   namespace   专题   png   img   lap   连通   div   

技术分享

题意:给你1~n的点的坐标,O x,表示x点修好,S x y表示查询x点能否连通y点,连通的条件是dis<d

直接判断最后查询时,是否在同一个集合就可以。

ps:注意两点是否在同一集合,必须用find()找,因为fa[]找的,可能不是最终的爸爸。

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 int n,d;
 6 int x[1005],y[1005];
 7 int vis[1005],fa[1005];
 8 
 9 bool ind(int a,int b)
10 {
11     return (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])<=d*d;
12 }
13 int find(int x)
14 {
15     if(fa[x]!=x) fa[x]=find(fa[x]);
16     return fa[x];
17 }
18 void unin(int a,int b)
19 {
20     int x=find(a);
21     int y=find(b);
22     if(x!=y) fa[x]=y;
23     return;
24 }
25 int main()
26 {
27     while(~scanf("%d%d",&n,&d))
28     {
29         for(int i=1;i<=n;i++)
30         {
31             scanf("%d%d",&x[i],&y[i]);
32             fa[i]=i;
33             vis[i]=0;
34         }
35         char s[2];
36         int a,b;
37         while(scanf("%c",&s)!=EOF)
38         {
39             if(s[0]==O)
40             {
41                 scanf("%d",&a);
42                 vis[a]=1;
43                 for(int i=1;i<=n;i++)
44                     if(vis[i] && ind(a,i) && i!=a)
45                         unin(i,a);
46             }
47             if(s[0]==S)
48             {
49                 scanf("%d%d",&a,&b);
50                 if(find(a)==find(b)) puts("SUCCESS");
51                 else puts("FAIL");
52             }
53         }
54     }
55     return 0;
56 }
View Code

 

kuangbin专题五、并查集

标签:size   code   namespace   专题   png   img   lap   连通   div   

原文地址:http://www.cnblogs.com/backlit/p/6701800.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!