并查集---------kuangbin带你飞合集

并查集的一个很重要的特性是传递性,如可以从a可以到b,从b可以到c,那么从a可以到c,如果满足这个的条件,要求一些特定的集合判定,属于那些集合,大多都属于并查集

poj2236

题意很简明::::

在一次地震中有n台电脑被损坏了,然后给出这n台电脑的坐标!

随后给出多组询问,以0开头就表示修理好这台电脑,如果是s就表示求两台电脑之间能否通讯

通讯的条件是两台电脑距离小于等于d且具有传递性  如a能和b通信,b能和c通信,然后a便能和c通信

一个要注意的一点是给出的欧几里得距离,但是这些坐标都是整数,所以可以用他们的平方来表示(而且最重要的一点是他们的平方并不大,以后碰到这种题目也可以朝这方面去想,因为这样可以保证不会出现精度问题,前提是不会爆long long)

从那个传递性来看的话可以考虑并查集(并查集是看一些元素是不是在一个联通分量里面的,而传递性正是联通分量的一种特性),但是没输入一台电脑,怎么把它维护与其他的关系呢

这样就只能暴力了,一开始一直没看时间复杂度,导致没敢暴力,这是问题啊。

以后看题一定是看出问题的模型,问题的本质,分析一下数据,然后看一下时空复杂度,而且还要对证一下样例,最后对证一些特值,

下面给出代码

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1100;
 7 int n,d;
 8 struct point{
 9     int x,y;
10 };
11 point pt[2010];
12 char cr;
13 int a,b;
14 int f[2010];
15 int vis[2010];
16
17 int find(int k){
18    if(f[k]==-1) return k;
19    else return f[k]=find(f[k]);
20 }
21
22 bool join(int s,int e){
23     return (pt[s].x-pt[e].x)*(pt[s].x-pt[e].x)+(pt[s].y-pt[e].y)*(pt[s].y-pt[e].y)<=d*d;
24 }
25
26 int main(){
27     scanf("%d%d",&n,&d);
28     for(int i=1;i<=n;i++) scanf("%d%d",&pt[i].x,&pt[i].y);
29     for(int i=1;i<=n;i++) f[i]=-1;
30     memset(vis,0,sizeof(vis));
31     while(scanf("\n%c",&cr)!=EOF){
32         if(cr==‘S‘){
33             scanf("%d%d",&a,&b);
34             int t1=find(a),t2=find(b);
35             if(t1!=t2) printf("FAIL\n");
36             else printf("SUCCESS\n");
37         }else{
38             scanf("%d",&a);
39             vis[a]=1;
40             for(int i=1;i<=n;i++){
41                 if(vis[i]==1&&i!=a){
42                     int t1=find(i),t2=find(a);
43                     if(t1==t2) continue;
44                     if(join(i,a)) f[t1]=t2;
45                 }
46             }
47         }
48     }
49     return 0;
50 }

原文地址:https://www.cnblogs.com/pandaking/p/9898554.html

时间: 2024-11-17 00:29:48

并查集---------kuangbin带你飞合集的相关文章

跟着chengyulala刷题之[kuangbin带你飞]之&#39;并查集&#39;专题/斜眼笑

[kuangbin带你飞] 专题1-23 https://vjudge.net/article/187 专题五 并查集 POJ 2236 Wireless Network  http://poj.org/problem?id=2236POJ 1611 The Suspects  http://poj.org/problem?id=1611HDU 1213 How Many Tables  http://acm.hdu.edu.cn/showproblem.php?pid=1213HDU 3038

Tarjan 联通图 Kuangbin 带你飞 联通图题目及部分联通图题目

Tarjan算法就不说了 想学看这 https://www.byvoid.com/blog/scc-tarjan/ https://www.byvoid.com/blog/biconnect/ 下面是几份基本的模版 首先是无向图割点桥的代码 下面的代码是用于求割点数目的 其中add_block[u] = x  表示删除u点之后增加的联通块个数.注意是增加的联通块个数 const int MAXN = 1010; const int MAXM = 10010; const int INF = 0x

kuangbin带你飞专题一 简单搜索 题解

目录 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题一 简单搜索 总结:用时2天半终于把这个专题刷完了 对于最基础的dfs bfs 路径打印 状态转移也有了一点自己些微的理解 其实2天半可以压缩到1天半的 主要是自己太懒了...慢慢加油刷bin神的专题呀 从大二下学期开始学算法 一开始就知道这个专题 一开始对于这个专题里的所有问题感觉都好难啊..就直接放弃了 看lrj的书 现在看到这个专题还挺唏嘘的吧 突然觉得思维和想法也不是很难 果然是那个时候心不静&还是储量不够吗

「kuangbin带你飞」专题十八 后缀数组

layout: post title: 「kuangbin带你飞」专题十八 后缀数组 author: "luowentaoaa" catalog: true tags: - kuangbin - 字符串 - 后缀数组 传送门 倍增法 struct DA{ bool cmp(int *r,int a,int b,int l){ return r[a]==r[b]&&r[a+l]==r[b+l]; } int t1[maxn],t2[maxn],c[maxn]; int r

「kuangbin带你飞」专题十二 基础DP

layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathjax: true - kuangbin - 动态规划 传送门 A.HDU1024 Max Sum Plus Plus 题意 给你N个数,然后你分成M个不重叠部分,并且这M个不重叠部分的和最大. 思路 动态规划最大m字段和,dp数组,dp[i][j]表示以a[j]结尾的,i个字段的最大和 两种情况:1.第a[j

「kuangbin带你飞」专题二十二 区间DP

layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - kuangbin - 区间DP - 动态规划 传送门 B.LightOJ - 1422 Halloween Costumes 题意 按顺序参加舞会,参加一个舞会要穿一种衣服,可以在参加完一个舞会后套上另一个衣服再去参加舞会,也可以在参加一个舞会的时候把外面的衣服脱了,脱到合适的衣服,但是脱掉的衣服不能再穿,参加完

「kuangbin带你飞」专题二十 斜率DP

layout: post title: 「kuangbin带你飞」专题二十 斜率DP author: "luowentaoaa" catalog: true tags: mathjax: true - kuangbin - 动态规划 - 斜率DP 传送门 A.HDU - 3507 Print Article 题意 就是输出序列a[n],每连续输出的费用是连续输出的数字和的平方加上常数M 让我们求这个费用的最小值. 题解 概率DP的入门题,把我搞得要死要活的. 首先dp[i]表示输出前i

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher :G - Power Strings POJ - 2406(kmp简单循环节)

[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher G - Power Strings POJ - 2406 题目: Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of

[kuangbin]带你飞之&#39;线段树&#39;专题(未完成)

// 带飞网址 https://vjudge.net/article/187 专题七 线段树 HDU 1166 敌兵布阵HDU 1754 I Hate It√ POJ 3468 A Simple Problem with IntegersPOJ 2528 Mayor's postersHDU 1698 Just a HookZOJ 1610 Count the ColorsPOJ 3264 Balanced LineupHDU 4027 Can you answer these queries?