寒假学习总结D8

本文介绍了作者寒假期间学习OpenCV的环境配置和学习资源,并重点讲解了并查集的基础算法,结合蓝桥杯比赛场景进行实践。通过分析云朵连成棉花糖的问题,阐述了并查集解决连通性问题的思路,提供了算法详解和代码实现。
摘要由CSDN通过智能技术生成

1.OpenCV环境配置

2.寒假基础算法训练(查并集)


1.python-OpenCV的学习准备

(1).OpenCV的安装

(103条消息) Pycharm安装opencv的几种办法(windows下)_WderFour的博客-CSDN博客_pycharm安装opencv

(2).OpenCV的学习路线

(103条消息) 如何学习opencv_zhangjunp3的博客-CSDN博客_opencv学习

(3).学习网课

【2021B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记)_哔哩哔哩_bilibili


2.寒假基础算法题(并查集)

相关资料:

(102条消息) 【算法与数据结构】—— 并查集_the_ZED的博客-CSDN博客_并查集

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值