没有比水题更令人开心的事情了
典型的并查集题目,并查集分为并和查,并就是把有关系的父亲根结点设为同一个,查就是在成功构造后对其进行查询
查通过递归实现
if (x == f[x])return x;
return f[x] = find(f[x]);
由于并查集的特点,我们必须要初始化f[i]=i;
设置一个根结点,当f中存的数也就是根结点时,直接返回原值,否则递归调用查找该结点的根结点并且将f设置为根结点
并是在查的基础上实现的
void merge(int a, int b) {f[find(a)] = find(b);
}
找到a的根结点并将其f值设置为b的根结点的值
#include<iostream>
using namespace std;
int f[100000];
int n, m, p;
int z, x, y;
int find(int x) {if (x == f[x])return x;return f[x] = find(f[x]);
}
int main() {cin >> n >> m>>p;for (int i = 1; i <= n; i++) f[i] = i;for (int i = 1; i <= m; i++) {cin >> x >> y;int xx = find(x);int yy = find(y);f[xx] = yy;}for (int i = 1; i <= p; i++) {int px, py;cin >> px >> py;int nx = find(px); int ny = find(py);if (nx == ny)cout << "Yes" << endl;else cout << "No" << endl;{}}return 0;
}
也是并查集的题目,只不过这一题需要自己计算每个点之间的距离,并且有点小坑,就是卫星电话哨所无论多远都能通话,所以真正需要保持最短路径的哨所,要是总哨所个数减去卫星通话哨所个数
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdio>
#include<cmath>
using namespace std;
int p, s, v, u, cnt, k;
double num;
int a[100000], b[100000];
struct node {double x, y, z;
}stu[1000000];
int f[100001];
bool cmp(node a, node b) {return a.z < b.z;
}
int find(int x) {if (f[x] == x)return x;return f[x] = find(f[x]);
}
int main() {cin >> s >> p;for (int i = 1; i <= p; i++)f[i] = i;for (int i = 1; i <= p; i++) {cin >> a[i] >> b[i];for (int j = 1; j < i; j++) {cnt++;stu[cnt].z = sqrt((a[i] - a[j]) * (a[i] - a[j]) + (b[i] - b[j]) *( b[i] - b[j]));stu[cnt].x = i;stu[cnt].y = j;}}sort(stu + 1, stu + cnt + 1, cmp);for (int i = 1; i <= cnt; i++) {int m = find(stu[i].x);int n = find(stu[i].y);if (m != n) {f[m] = n;k++;num = stu[i].z;if (k >= p - s) {printf("%.2lf", num);return 0;}}}return 0;
}
msq基础
1.表:某种特定类型数据结构化清单
2.列:表中的一个字段,所有表都是由一个或多个列组成的
3.数据类型:所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据
5.行:表中的数据是按行存储的,所保存的每个记录存储在自己的行内。
6.主健:表中每一行都应该有自己可以唯一标识自己的一列。用主健来表示一个特定的行
什么是sql
sql是一种专门用来与数据库通信的语言