HNUCM-2022年秋季学期《算法分析与设计》练习14

news2024/11/23 13:37:39

目录

问题 A: 最小生成树(Prim)

问题 B: 牛妹的蛋糕

问题 C: 尼科彻斯定理

问题 D: 最小生成树(Kruskal)

问题 E: 单源最短路径问题

问题 F: 搭建电路

问题 G: 丛林小道

问题 H: 低碳出行


问题 A: 最小生成树(Prim)

题目描述

使用Prim算法求图的最小生成树(MST)

输入

每组数据分为两个部分,第一部分为图的点数n,和边数m,
第二部分为m行,每一行输入三个数字,前两个为两个顶点的编号,第三个为边权重。

输出

最小生成树,输出时按照边的两个端点的升序输出。(先看左端点,再看右端点,端点不换位置)

思路:按Prime算法思路来就行,不过这里题解使用的是Kruskal算法,结果按题意注意排序。

while True:
    try:
        n, m = map(int, input().split())
        maze = [list(map(int, input().split())) for _ in range(m)]
        _, cnt, visited, res = maze.sort(key=lambda x: x[2]), 1, [], []
        a, b, c = maze.pop(0)
        visited.extend([a, b]), res.append([a, b, c])
        while cnt < n - 1:
            for i in range(len(maze)):
                a, b, c = maze[i]
                if (a not in visited or b not in visited) and (a in visited or b in visited):
                    visited.append(a) if a not in visited else visited.append(b)
                    _, _, cnt = res.append([a, b, c]), maze.pop(i), cnt + 1
                    break
        res.sort()
        for a, b, c in res:
            print(a, b, c)
    except:
        break

问题 B: 牛妹的蛋糕

题目描述

众所周知,牛妹非常喜欢吃蛋糕。

第一天牛妹吃掉蛋糕总数三分之一多一个,第二天又将剩下的蛋糕吃掉三分之一多一个,以后每天吃掉前一天剩下的三分之一多一个,到第n天准备吃的时候只剩下一个蛋糕。

牛妹想知道第一天开始吃的时候蛋糕一共有多少呢?

输入

输入n,0<n< 30。

输出

输出第一天蛋糕的数量。

思路:按题目意思不难知道,前一天 = (今天 + 1)* 3 // 2

while True:
    try:
        n, m = int(input()), 1
        for _ in range(1, n):
            m = (m + 1) * 3 // 2
        print(m)
    except:
        break

问题 C: 尼科彻斯定理

题目描述

验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。

例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

输入

多组输入,输入一个整数。

输出

输出分解后的字符串。

思路:不难发现中位数是m的平方,根据偶数、奇数稍微处理一下就行。

while True:
    try:
        m, res = int(input()), []
        t = m ** 2
        if m % 2 == 1:
            _, a, b = res.append(t), t - 2, t + 2
        else:
            a, b = t - 1, t + 1
        while len(res) < m:
            _, a, b = res.extend([a, b]), a - 2, b + 2
        res.sort()
        for i in range(m):
            print(f"+{res[i]}", end='') if i != 0 else print(res[i], end='')
        print()
    except:
        break

问题 D: 最小生成树(Kruskal)

题目描述

编程实现Kruskal算法,求图的最小生成树(MST)的权重。

输入

每组数据分为两个部分,第一部分为图的点数n,和边数m, 
第二部分为m行,每一行输入三个数字,前两个为两个顶点的编号,第三个为边权重。 

输出

最小生成树的权重。

思路:按算法的思路实现即可。

while True:
    try:
        n, m = map(int, input().split())
        maze = [list(map(int, input().split())) for _ in range(m)]
        _, cnt, visited, res = maze.sort(key=lambda x: x[2]), 1, [], 0
        a, b, c = maze.pop(0)
        _, res = visited.extend([a, b]), res + c
        while cnt < n - 1:
            for i in range(len(maze)):
                a, b, c = maze[i]
                if (a not in visited or b not in visited) and (a in visited or b in visited):
                    visited.append(a) if a not in visited else visited.append(b)
                    res, _, cnt = res + c, maze.pop(i), cnt + 1
                    break
        print(res)
    except:
        break

问题 E: 单源最短路径问题

题目描述

编程实现Dijkstra算法,求一个有向加权图中,从源点出发到其他各个顶点的最短路径。

输入

第1行第1个值表示顶点个数,第2个值表示边个数;第2行开始为边(两个顶点,边的起点和终点)及权重。

输出

顶点0到每一个顶点的最短路径长度。

思路:按算法的思路实现即可。

def get():
    x, y = float('inf'), -1
    for k in range(n):
        if nums[k] < x and k not in s:
            x, y = nums[k], k
    return y, x


def update(x: int):
    for k in range(n):
        if k not in s:
            nums[k] = min(nums[x] + maze[x][k], nums[k])


while True:
    try:
        n, m = map(int, input().split())
        maze, nums, s = [[float('inf')] * n for _ in range(n)], [0] + [float('inf')] * (n - 1), [0]
        for i in range(m):
            a, b, c = map(int, input().split())
            maze[a][b] = c
        for i in range(1, n):
            nums[i] = maze[0][i]
        while len(s) < n:
            index, edg = get()
            nums[index], _ = edg, s.append(index)
            update(index)
        for i in range(n):
            print(nums[i], end='') if i == 0 else print('', nums[i], end='')
        print()
    except:
        break

问题 F: 搭建电路

题目描述

明明迷上了一个搭建电路的游戏。
在游戏中,每次在两个电子元件之间增加一条有效电路(两个元件之间先前没有电路相连)都将获得相应的积分奖励。
已知电子元件数量n和部分电子元件之间的奖励积分值。如何构建一个有效电路将所有元件全部连接起来,并且可以得到最多的积分奖励。

输入

每组输入数据包含m+1行。
第1行输入两个正整数n和m,其中n表示电子元件数量(n<=100),m表示提供了m对电子元件之间的奖励积分值(m<=1000)。两个正整数之间用空格隔开。
第2行到第m+1行对应m对电子元件及其对应的奖励积分值,每一行包含三个正整数,第1个和第2个整数表示电子元件编号(从1开始),第3个整数表示两个元件之间搭建电路的奖励积分num(num<1e9)。整数之间用空格隔开。

输出

每组输出占1行,输出一个正整数,即最多可以得到的积分奖励值。如果没有办法把所有元件全部连接起来,则输出“No solution.”。

思路:最小生成树的变种——最大生成树,排序倒序一下即可,稍微注意判断一下不能连起来的情况,这里用一个flag记录。

while True:
    try:
        n, m = map(int, input().split())
        maze = [list(map(int, input().split())) for _ in range(m)]
        _, cnt, visited, res = maze.sort(reverse=True, key=lambda x: x[2]), 1, [], 0
        a, b, c = maze.pop(0)
        _, res, flag = visited.extend([a, b]), res + c, True
        while cnt < n - 1 and flag:
            flag = False
            for i in range(len(maze)):
                a, b, c = maze[i]
                if (a not in visited or b not in visited) and (a in visited or b in visited):
                    visited.append(a) if a not in visited else visited.append(b)
                    res, _, cnt, flag = res + c, maze.pop(i), cnt + 1, True
                    break
        print(res) if flag else print("No solution.")
    except:
        break

问题 G: 丛林小道

题目描述


The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to maintain. The Council of Elders must choose to stop maintaining some roads. The map above on the left shows all the roads in use now and the cost in aacms per month to maintain them. Of course there needs to be some way to get between all the villages on maintained roads, even if the route is not as short as before. The Chief Elder would like to tell the Council of Elders what would be the smallest amount they could spend in aacms per month to maintain roads that would connect all the villages. The villages are labeled A through I in the maps above. The map on the right shows the roads that could be maintained most cheaply, for 216 aacms per month. Your task is to write a program that will solve such problems.

The input consists of one to 100 data sets, followed by a final line containing only 0. Each data set starts with a line containing only a number n, which is the number of villages, 1 < n < 27, and the villages are labeled with the first n letters of the alphabet, capitalized. Each data set is completed with n-1 lines that start with village labels in alphabetical order. There is no line for the last village. Each line for a village starts with the village label followed by a number, k, of roads from this village to villages with labels later in the alphabet. If k is greater than 0, the line continues with data for each of the k roads. The data for each road is the village label for the other end of the road followed by the monthly maintenance cost in aacms for the road. Maintenance costs will be positive integers less than 100. All data fields in the row are separated by single blanks. The road network will always allow travel between all the villages. The network will never have more than 75 roads. No village will have more than 15 roads going to other villages (before or after in the alphabet). In the sample input below, the first data set goes with the map above.

The output is one integer per line for each data set: the minimum cost in aacms per month to maintain a road system that connect all the villages. Caution: A brute force solution that examines every possible set of roads will not finish within the one minute time limit.

思路:就是输入稍微变了一下的最小生成树题目,输入稍微处理一下,如何就可以套用最小生成树的模板。

def get_input():
    ss = []
    for _ in range(1, n):
        tmp = input().split()
        s, m = tmp.pop(0), int(tmp.pop(0))
        for _ in range(m):
            v, cc = tmp.pop(0), int(tmp.pop(0))
            ss.append([s, v, cc])
    return ss


while True:
    try:
        n = int(input())
        if n == 0:
            break
        maze = get_input()
        _, cnt, visited, res = maze.sort(key=lambda x: x[2]), 1, [], 0
        a, b, c = maze.pop(0)
        _, res = visited.extend([a, b]), res + c
        while cnt < n - 1:
            for i in range(len(maze)):
                a, b, c = maze[i]
                if (a not in visited or b not in visited) and (a in visited or b in visited):
                    visited.append(a) if a not in visited else visited.append(b)
                    res, _, cnt = res + c, maze.pop(i), cnt + 1
                    break
        print(res)
    except:
        break

问题 H: 低碳出行

题目描述

为了做一项关于“爱护环境,从小做起”的公益调查,新司机小明决定开老爸的车从家中前往X市第一小学。从小明家到X市第一小学的交通网络图一共有n个顶点(包括起点小明家和终点X市第一小学)和m条无向边。每条边都有一个碳排放量和一个行驶时间(单位:分钟)。
现在需要你编写一个程序帮助小明实现低碳出行,即寻找一条碳排放量最少的路径,一条路径的碳排放量等于该路径上所有边的碳排放量之和。如果存在两条碳排放量相同的路径,则找出总的行驶时间最少的路径,并输出该路径的总碳排放量和总的时间(分钟)。

输入

单组输入。
在每组输入中,第1行包含两个正整数n和m,分别表示顶点数和边数(n<=1000且m<=1000)。其中,第1号顶点为起点(小明家),第n号顶点为终点(X市第一小学)。两个正整数之间用空格隔开。
第2行到第m+1行表示m条边的信息,每一行包含四个正整数。第1个正整数和第2个正整数表示一条边所对应的两个顶点的编号,第3个正整数表示该边对应的碳排放量,第4个正整数表示该边所对应的行驶时间(单位:分钟)。四个正整数两两之间用空格隔开。

输出

对于每组输入,输出碳排放量最少的路径的总碳排放量和总时间(分钟),如果存在两条碳排放量相同的路径,则输出总的行驶时间最少的路径的总碳排放量和总时间。

思路:待更新。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

frontend webstorm plugin:插件推荐

目录CodeGlance &#xff08;左边地图&#xff09;GitToolBox &#xff08;Git提示&#xff09;Material Theme UI &#xff08;主题框架&#xff09;Nyan Progress Bar &#xff08;进度条&#xff09;Rainbow Brackets&#xff08;括号颜色&#xff0c;注意忽略变量&#xff…

【MySQL】事务和索引

文章目录事务&#xff08;Transaction&#xff09;1. 定义2. 如何操作事务2.1 SQL 语句操作事务的几个关键字2.2 使用 SQL 语句操作事务2.3 JDBC 操作事务3. 事务的四个特性&#xff1a;ACID3.1 Atomic&#xff08;原子性&#xff09;3.1.1 理解原子性3.2 Consistency&#xff…

H3C WX2510H无线控制器开局如何简单配置

环境&#xff1a; H3C-WX2510H version 7.1.064, Release 5435P02 AP H3CWA6320-C 问题描述&#xff1a; H3C WX2510h无线控制器开局如何简单配置 解决方案&#xff1a; 1.PC网卡设置ip192.168.0.111&#xff0c;连接随便一个LAN口 2.浏览器访问https://192.168.0.100…

面试处处碰壁?不慌,Java 核心面试文档.PDF 助你披荆斩棘

前言 首先强调几点&#xff1a; 1. 一定要谨慎对待写在简历上的东西&#xff0c;一定要对简历上的东西非常熟悉。因为一般情况下&#xff0c;面试官都是会根据你的简历来问的&#xff1b; 2. 能有一个上得了台面的项目也非常重要&#xff0c;这很可能是面试官会大量发问的地…

如何采集需要验证码登录的网站数据

如何抓取网页上的数据,需要登录&#xff1f;随着互联网的发展&#xff0c;移动支付技术的普及&#xff0c;以及人们对内容进行消费的观念逐渐养成。有很多网站&#xff0c;需要付费后才能查看&#xff0c;或者是开通会员之类的才能查看。针对这类网站&#xff0c;我们如何快速的…

性能测试环境部署

一、安装JDK 【步骤一】安装JDK (安装Jmeter之前需要配置JAVA环境) 下载jdk&#xff0c;到官网下载jdk&#xff0c;地址&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/index.html 【JDK版本要和JMeter版本对应&#xff0c;如果JDK版本过高&#x…

深度学习入门(8)激活函数ReLU和 Sigmoid的计算图表示方式及代码实现

《深度学习入门》系列文章目录 深度学习入门 (1)感知机 深度学习入门&#xff08;2&#xff09;神经网络 深度学习入门&#xff08;3&#xff09;神经网络参数梯度的计算方式 深度学习入门&#xff08;4&#xff09;【深度学习实战】无框架实现两层神经网络的搭建与训练过程…

黑盒测试用例设计 - 等价类划分法

说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分。 分类&#xff1a; 有效等价类&#xff1a;满足需求的数据集合无效等价类&#xff1a;不满足需求的数据集合 步骤&#xff1a; 明确需求设计一个新的测试用例&#xff0c;使其尽可能多的覆…

如何申请软件著作权

申请软件著作权的好处&#xff1a; 1、软件著作权登记证书是在软件著作权发生争议时&#xff0c;证明软件权利的最有力证。这不仅是在进行诉讼或者是发生一般纠纷时都能起到很好的证明作用&#xff0c;但是如果没有进行登记&#xff0c;著作权人的权利就很难获得全面的保护。 …

Linux-scheduler之负载均衡(一)

一、如何衡量CPU的负载 衡量CPU负载 简单衡量 CPU负载就绪队列的总权重CPU负载 就绪队列的总权重 CPU负载就绪队列的总权重 量化负载 CPU负载(采样期间累计运行时间/采样总时间)∗就绪队列总权重CPU负载 (采样期间累计运行时间/采样总时间)*就绪队列总权重 CPU负载(采样期…

Flutter 创建自己的对话框,不使用任何包!

创建自己的对话框&#xff0c;不使用任何包&#xff01; 原文 https://itnext.io/create-your-own-dialog-without-using-any-packages-7bb303f62471 前言 在本文中&#xff0c;我们将学习如何创建我们自己的 showDialog() 函数&#xff0c;并了解到底发生了什么。 正文 先看效…

Matplotlib 可视化50图:散点图(1)

导读 本系列将持续更新50个matplotlib可视化示例&#xff0c;主要参考Selva Prabhakaran 在MachineLearning Plus上发布的博文&#xff1a;Python可视化50图。 定义 关联图是查看两个事物之间关系的图像&#xff0c;它能够展示出一个事物随着另一个事物是如何变化的。关联图的类…

ctfshow(菜狗杯)

目录 web签到 一言既出 驷马难追 web2 c0me_t0_s1gn 我的眼里只有$ TAPTAPTAP Webshell 化零为整 无一幸免 遍地飘零 传说之下&#xff08;雾&#xff09; Is_Not_Obfuscate web签到 <?phperror_reporting(0); highlight_file(__FILE__);eval($_REQUEST[$_GET[…

springboot大学生课堂考勤管理系统的设计与实现

根据一般学生课堂考勤管理系统的功能需求分析&#xff0c;本系统的功能模块如下&#xff1a; &#xff08;1&#xff09;在个人中心&#xff0c;管理员可以修改自己的用户名和登录密码。 &#xff08;2&#xff09;在学生管理模块中&#xff0c;可以查看学生的信息&#xff0c;…

DiffusionDet:Diffusion Model for Object Detection

Diffusion Model for Object Detection 一种用于目标检测的扩散模型 Motivation 1、如何使用一种更简单的方法代替可查询的object queries 2、Bounding box的生成方式过去是三种&#xff0c;第一种为sliding windows、第二种anchor box、第三种object queries&#xff0c;这里其…

AlphaFold2源码解析(3)--数据预处理

AlphaFold2源码解析(3)–数据预处理 数据预处理整体流程 数据处理入口&#xff1a; feature_dict data_pipeline.process( input_fasta_pathfasta_path,# 输入序列目录 msa_output_dirmsa_output_dir) # MSA序列目录 可能是单体也可能是多聚体 主要调动的API是&#xff1a; …

如何让Java项目兼容更多的客户端设备(二)

如何让Java项目兼容更多的客户端设备&#xff08;二&#xff09; ​ ​ 一、Token认证的原理 传统的单体JavaWeb项目通常采用HttpSession保存登陆成功的凭证&#xff0c;但是HttpSession需要浏览器的Cookie机制配合。也就是说Web项目的客户端只能是浏览器&#xff0c;不可以…

torch.nn.functional.grid_sample(F.grid_sample)函数的说明 3D空间中的点向图像投影的易错点

由于二者有一定共通之处&#xff0c;因此放在一篇文章内介绍。 1. 关于torch.nn.functional.grid_sample函数的说明&#xff08;F.grid_sample&#xff09; 该函数的作用是在图像/体素空间中采样特征。 1.1 输入和输出&#xff1a; 变量名数据类型默认值含义备注inputTensor-…

训练神经网络的各种优化算法【文末赠书】

正确的优化算法可以成倍地减少训练时间 许多人在训练神经网络时可能会使用优化器&#xff0c;而不知道该方法称为优化。优化器是用于更改神经网络属性&#xff08;例如权重和学习率&#xff09;以减少损失的算法或方法。 文章目录梯度下降随机梯度下降小批量梯度下降其它优化算…

C/C++指针之提高篇详解(二)

一、引言 C/C语言中引入了指针&#xff0c;使得程序能够直接访问内存地址&#xff0c;使得很多复杂的操作变得简单&#xff0c;同时也提高了程序的运行效率。指针即是地址&#xff0c;但是地址却是通过指针变量来存储的。这就好比我们的教室&#xff0c;每个教室都有一个房间号…