2.15总结

2024-02-16 02:52
文章标签 总结 2.15

本文主要是介绍2.15总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天主要在写洛谷上的题,加上有几天没敲代码了,顺便复习了一些之前学过的东西

最小生成树(kruscal和prim)

kruscal算法要将所有的边从小到大进行排序,进行并查集的操作,将不是同一个父亲的合并,直到所有点为一个集合,合成了n-1条边(有n个点)

prim算法和dijstal算法有一些相似的地方,在所有点里任意找一个点,从这个点开始往下寻找,找到附件较小的权边为第二个点,再将两个点同时开始寻找,把相邻最小的权边确定为下一个点,以此操作,直到达到目的

P3366 【模板】最小生成树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz

输入格式

第一行包含两个整数 N,M,表示该图共有 N 个结点和 M 条无向边。

接下来 M 行每行包含三个整数 Xi​,Yi​,Zi​,表示有一条长度为 Zi​ 的无向边连接结点 Xi​,Yi​。

输出格式

如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出 orz

输入输出样例

输入 

4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3

输出 

7

说明/提示

数据规模:

对于 20%20% 的数据,N≤5,M≤20。

对于 40%40% 的数据,N≤50,M≤2500。

对于 70%70% 的数据,N≤500,M≤104。

对于 100%100% 的数据:1≤N≤5000,1≤M≤2×105,1≤Zi​≤104。

思路:建立结构体将样例输入后可以使用kruscal来解决,将所有的数按权边大小从小到大进行排列(要求最小就要顺序排列),依次进行并查集的操作,每合并一次cnt+1、sum加上此时的权边值,当cnt的值等于点数-1时输出结果结束程序(因为是从小到大排列,得到的自然会是最小值),否则输出orz结束程序

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int n, m,sum,counts;
int f[200005];
struct edge {int x;int y;int z;
}eg[200005];
bool cmp(edge a, edge b) {return a.z < b.z;
}
//void quicksort(int left, int right) {
//	int i, j;
//	i = left;
//	j = right;
//	struct edge t;
//	while (i != j) {
//		while (eg[j].z > eg[left].z && i < j)
//			j--;
//		while (eg[i].z < eg[left].z && i < j)
//			i++;
//		if (i < j) {
//			t = eg[i];
//			eg[i] = eg[j];
//			eg[j] = t;
//		}
//	}
//	t = eg[left];
//	eg[left] = eg[i];
//	eg[i] = eg[left];
//	quicksort(left, i - 1);
//	quicksort(i + 1, right);
//	return;
//}
int find(int x) {if (f[x] == x)return x;f[x] = find(f[x]);return f[x];
}
int merge(int x, int y) {int f1 = find(x);int f2 = find(y);if (f1 != f2) {f[f1] = f2;return 1;}return 0;
}
int main() {cin >> n >> m;sum = 0, counts = 0;for (int i = 1; i <= m; i++) {cin >> eg[i].x >> eg[i].y >> eg[i].z;}for (int i = 1; i <= m; i++)f[i] = i;/*quicksort(1, m);*/sort(eg + 1, eg + 1 + m, cmp);for (int i = 1; i <= m; i++) {if (merge(eg[i].x, eg[i].y)) {counts++;sum+=eg[i].z;}if (counts == n - 1) {cout << sum;return 0;}}cout << "orz" << endl;return 0;
}

P1194 买礼物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

又到了一年一度的明明生日了,明明想要买 B 样东西,巧的是,这 B 样东西价格都是 A 元。

但是,商店老板说最近有促销活动,也就是:

如果你买了第 I 样东西,再买第 J 样,那么就可以只花 KI,J​ 元,更巧的是,KI,J​ 竟然等于 KJ,I​。

现在明明想知道,他最少要花多少钱。

输入格式

第一行两个整数,A,B。

接下来 B 行,每行B 个数,第 I 行第 J 个为 KI,J​。

我们保证 KI,J​=KJ,I​ 并且 KI,I​=0。

特别的,如果 KI,J​=0,那么表示这两样东西之间不会导致优惠。

注意 KI,J​ 可能大于 A。

输出格式

一个整数,为最小要花的钱数。

输入输出样例

输入 

1 1
0

输出 

1

输入 

3 3
0 2 4
2 0 2
4 2 0

输出 

7

说明/提示

样例解释 22。

先买第 22 样东西,花费 33 元,接下来因为优惠,买 1,31,3 样都只要 22 元,共 77 元。

(同时满足多个“优惠”的时候,聪明的明明当然不会选择用 44 元买剩下那件,而选择用 22 元。)

数据规模

对于 30%30% 的数据,1≤B≤10。

对于 100%100% 的数据,1≤B≤500,0≤A,KI,J​≤1000。

思路:利用买完I后买J这个规则进行构图,把Kij的价格看成权边,每一个Kij有着自己的邻点,同样使用kruscal算法先排序,然后进行并查集操作,当原始价格A小于Kij的价格时加上A,否则加上Kij

代码:

#include<iostream>
#include<algorithm>
using namespace std;
struct node
{int x;int y;int w;
}edge[1000005];
int fa[1000005];
bool cmp(node x, node y)
{return x.w < y.w;
}
int find(int x)
{if (x == fa[x])return x;fa[x] = find(fa[x]);return fa[x];
}
void combine(int x, int y)
{x = find(x);y = find(y);fa[x] = y;
}
int main()
{int a, b;cin >> a >> b;int jj = 0;for (int i = 1; i <= b; i++)fa[i] = i;for (int i = 1; i <= b; i++)for (int j = 1; j <= b; j++){cin >> edge[++jj].w;edge[jj].x = i;edge[jj].y = j;if (edge[jj].w == 0)edge[jj].w = a;}sort(edge + 1, edge + 1 + jj, cmp);int sum = a;for (int i = 1; i <= jj; i++){if (find(edge[i].x) != find(edge[i].y)) {combine(edge[i].x, edge[i].y);if (edge[i].w < a)sum += edge[i].w;else sum += a;}}cout << sum << endl;return 0;
}

P1359 租用游艇 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

长江游艇俱乐部在长江上设置了 n 个游艇出租站1,2,⋯,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站 i 到游艇出租站 j 之间的租金为 r(i,j)(1≤i<j≤n)。试设计一个算法,计算出从游艇出租站 11 到游艇出租站 n 所需的最少租金。

输入格式

第一行中有一个正整数 n,表示有 n 个游艇出租站。接下来的 n−1 行是一个半矩阵 r(i,j)(1≤i<j≤n)。

输出格式

输出计算出的从游艇出租站 11 到游艇出租站 n 所需的最少租金。

输入输出样例

输入 

3
5 15
7

输出 

12

说明/提示

n≤200,保证计算过程中任何时刻数值都不超过 106。

思路:把数组补全之后用floyed,用一个二维数组来得到每两个点之间的最短距离,最后直接输出a[起始点][目标点]

代码:

#include<iostream>
using namespace std;
int main() {int n;int a[205][205];cin >> n;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {a[i][j] = 999999;}}for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {cin >> a[i][j];}}for (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (a[i][j] > a[i][k] + a[k][j])a[i][j] = a[i][k] + a[k][j];}}}cout << a[1][n] << endl;return 0;
}

这篇关于2.15总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/713283

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio