8.2-8.3 把所布置的算法题完成了主要学习了并查集还有二分查找的思想
为首的就是并查集的模板 这个相对来说很简单,就是并查集基本的算法看两个节点是否在同一个集合内,这也是最小生成树算法中最基本的一点
int find(int x)
{
if (a[x] == x)
{
return x;
}
else
a[x] = find(a[x]);
return a[x];
}
这个就是并查集中最基本的查找数据,在之后的最小生成树算法中也要多次用到
下一个就是最小生成树了,最小生成树有两种算法分别是kruskal和prim算法我这里用的是kruskal算法
int fa[N]; // 并查集
int find(int x) {
if (fa[x] != x) {
fa[x] = find(fa[x]); // 路径压缩
}
return fa[x];
}
首先就是要刚刚说过的并查集来判断两个节点是否在总一个集合当中
int kruskal() {
int sum = 0;
int edge_count = 0;
for (int i = 1; i <= n; ++i) {
fa[i] = i; // 初始化并查集
}
sort(edges.begin(), edges.end(), cmp);
for (auto& e : edges) {
int u = e.u, v = e.v, w = e.w;
int root_u = find(u);
int root_v = find(v);
if (root_u != root_v) {
fa[root_u] = root_v;
sum += w;
edge_count++;
if (edge_count == n - 1) {
return sum;
}
}
}
return -1;
}
然后便是kruskal算法的基本逻辑,最后输出主函数进行方法的调用
这个题目的基本逻辑和最小生成树差不多 所以就不多说了
8.4实现了项目中随机选人的基本逻辑 并学习了listview的相关知识
要注意在选人的时候不可以重复选到人,这里用了一个判断逻辑,并且还增加了如果想要选择多少个人在文本框上输入相应的人数即可输出相同数量的数据
int numberOfPersonsToSelect = Math.min(num, people.size());
List<String> selectedPersons = new ArrayList<>();
Random random = new Random();
while (selectedPersons.size() < numberOfPersonsToSelect) {
int index = random.nextInt(people.size());
String selectedPerson = people.get(index);
if (!selectedPersons.contains(selectedPerson)) {
selectedPersons.add(selectedPerson);
}
// System.out.println(selectedPerson);
}