?沒有比水題更令人開心的事情了
典型的并查集題目,并查集分為并和查,并就是把有關系的父親根結點設為同一個,查就是在成功構造后對其進行查詢
查通過遞歸實現
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是一種專門用來與數據庫通信的語言
?