1.OpenCV环境配置
2.寒假基础算法训练(查并集)
1.python-OpenCV的学习准备
(1).OpenCV的安装
(103条消息) Pycharm安装opencv的几种办法(windows下)_WderFour的博客-CSDN博客_pycharm安装opencv
(2).OpenCV的学习路线
(3).学习网课
【2021B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记)_哔哩哔哩_bilibili
2.寒假基础算法题(并查集)
相关资料:
T1:
题目背景
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。
有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。
题目描述
给你云朵的个数 N,再给你 M 个关系,表示哪些云朵可以连在一起。
现在小杉要把所有云朵连成 K 个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。
输入格式
第一行有三个数 N,M,K。
接下来 MM 行每行三个数 X,Y,L,表示X云和 Y 云可以通过 L的代价连在一起。
输出格式
对每组数据输出一行,仅有一个整数,表示最小的代价。
如果怎么连都连不出 K 个棉花糖,请输出 No Answer
。
输入输出样例
输入
3 1 2 1 2 1
输出
1
说明/提示
对于 30% 的数据,N≤100,M≤10^3;
对于 100% 的数据, 1≤N≤10^3,1≤M≤10^4,1≤K≤10,1≤X,Y≤N,0≤L<10^4。
算法思路: (以下是别人的解释,我觉得还不错)
有一句话说的是 如果n个点被n-1条边连接的话,这一定是棵树。
那么:
连的边数 得到的树的个数
n-1 1
n-2 2
n-3 3
... ...
n-k k
所以我们如果想要连出k棵树,就需要连n-k条边。
题目要求用n朵云连出k个棉花糖。
因为每个棉花糖都是连通的,
那么每个棉花糖就相当于是一棵树。
就是说要用n个节点连出k棵树。
也就是说要用n-k条边连出k棵树。
也就是说要花费连出n-k条边的代价。
既然一定要花费连出n-k条边的代价,
那么当然要选择代价最小的边连起来。
所以给每条可以连的边按代价从小到大排个序,
然后连n-k条边造k个最小生成树就可以了。
如果给的关系数m小于需要连的边数(n-k),是一定连不出k个树来的,因为m个关系只能连m条边
我的题解代码:
#include<iostream>
#include <iomanip>
#include<algorithm>
#include<vector>
using namespace std;
int pre[10001];
struct win
{
int A;
int B;
int Z;
};
win arr[10001];
int find(int x) {
while (pre[x]!=x)
{
x = pre[x];
}
return x;
}
bool comp(win a,win b) {
return a.Z < b.Z;
}
int main() {
int N, M, K,sum=0,ans=0;
cin >> N >> M >> K;
for (int i = 1; i <= N; i++) pre[i] = i;
for (int i = 1; i <= M;i++) {
cin >> arr[i].A >> arr[i].B >> arr[i].Z;
}
sort(arr+1,arr+M+1,comp);
for (int i = 1; i <= M;i++) {
int fx = find(arr[i].A), fy = find(arr[i].B);
if (fx!=fy) //如果这两个父结点不在同一棵树中
{
pre[fx] = fy; //随便指定一个根结点为合并两棵树的父结点
sum++; //棉花糖个数
ans += arr[i].Z;
}
if (sum == N - K)
{
cout << ans;
return 0;
}
else if (K==N) { //当恰好有N朵云做成K个棉花糖(此时: K==N)时,即有N棵数,不需要连
cout << 0;
return 0;
}
}
puts("NO ANSWER!");
return 0;
}