CCF-CSP真题《202305-4 电力网络》思路+python,c++满分题解

2023-11-05 22:12

本文主要是介绍CCF-CSP真题《202305-4 电力网络》思路+python,c++满分题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全

试题编号:202305-4
试题名称:电力网络
时间限制:1.0s
内存限制:512.0MB
问题描述:

问题描述

西西艾弗岛电力公司需要修建一套电网对岛上的众多城镇进行供电。电网设施包括建造在城镇中的变电站,与建造在城镇间的输电线路。根据前期的考察结果,电力公司已经确定了哪些城镇之间需要建造输电线路,以使得所有城镇能够被连接成一个电力网络。每座城镇只需要建造一个变电站,却都向电力公司提供了多个建造候选地址。对于每个城镇,不同候选地址的变电站造价不同;对于城镇间的输电线路,其造价也会随着两端变电站的候选地址的变化而变化。因此,电力公司想要知道,在所有候选地址的组合中,电网的总造价(变电站造价加上输电线路造价)最低是多少。

输入格式

从标准输入读入数据。

输入的第一行包括三个正整数 N、M、K。表示一共有 N 座城镇,需要建造 M 条输电线路,每座城镇都提供了 K 个变电站候选地址。

接下来输入 N 行,每行表示一个城镇。每行包含 K 个整数,表示该城镇不同候选地址的变电站造价。

接下来 M 行,每行表示一条输电线路,包含 K2+2 个整数。前两个整数表示该输电线路两端的城镇,范围是 [0, N)。第三个整数开始是大小为 K×K 的矩阵 T 的行主序存储形式。Tij 表示当输电线路的第一个端点选择候选地址 i,第二个端点选择候选地址 j 时的线路造价。

输出格式

输出到标准输出中。

输出包含一行,这一行有一个整数,表示电网的最低总造价。

样例输入

2 1 2
1 2
3 4
0 1 1 2 3 4

Data

样例输出

5

Data

样例说明

城镇 0 与城镇 1 均选择了 0 号地址建造变电站。

子任务

对于全部数据,保证由城镇与输电线路构成的图是无向无重边无自环的连通图,保证单个变电站与单条线路的造价均不超过 1000。

对于 20% 的数据,保证 N≤6,K≤10。

对于另外 20% 的数据,保证 N≤104,K≤10,M=N−1。

对于另外 20% 的数据,保证 N≤104,K≤10,M=N。

对于另外 20% 的数据,保证 N≤104,K≤10。图中存在两个节点 S、D,保证全图去除 D 节点和与 D 节点相连的边后,可以构成以 S 节点为根的一棵树,而且所有与 D 相连的节点都属于这棵树的叶子节点。

对于最后 20% 的数据,保证 N≤104,K≤10,且度数大于 2 的节点数量 ≤6。

真题来源:电力网络

感兴趣的同学可以如此编码进去进行练习提交

c++ 80分题解: 

#include <bits/stdc++.h>
using namespace std;
using LL = long long;const LL inf = 1e18;int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n, k, m;cin >> n >> m >> k;vector<vector<int>> pcost(n, vector<int>(k));for(auto &i : pcost)for(auto &j : i)cin >> j;vector<vector<array<int, 2>>> edge(n);vector<array<int, 2>> edges(m);vector<vector<int>> ecost(m, vector<int>(k * k));for(int i = 0; i < m; ++ i){int u, v;cin >> u >> v;edges[i] = {u, v};edge[u].push_back({v, i});edge[v].push_back({u, i});for(auto &j : ecost[i])cin >> j;}if (n <= 6 && k <= 10){vector<int> used(n);LL ans = inf;LL tmp = 0;function<void(int)> dfs = [&](int x){if (x == n){LL back = tmp;for(int i = 0; i < m; ++ i){int u = edges[i][0], v = edges[i][1], id = i;int r = used[u] * k + used[v];tmp += ecost[id][r];}ans = min(ans, tmp);tmp = back;return;}for(int i = 0; i < k; ++ i){tmp += pcost[x][i];used[x] = i;dfs(x + 1);tmp -= pcost[x][i];}};dfs(0);cout << ans << '\n';}else if (m == n - 1){vector<vector<LL>> dp(n, vector<LL>(k, 0));function<void(int, int)> dfs = [&](int u, int fa){for(auto e : edge[u]){int v = e[0], id = e[1];if (v == fa)continue;dfs(v, u);for(int i = 0; i < k; ++ i){LL tmp = inf;for(int j = 0; j < k; ++ j){int L = i, R = j;if (u != edges[id][0])swap(L, R);int r = L * k + R;tmp = min(tmp, dp[v][j] + pcost[v][j] + ecost[id][r]);}dp[u][i] += tmp;}}};dfs(0, 0);LL ans = inf;for(int i = 0; i < k; ++ i)ans = min(ans, dp[0][i] + pcost[0][i]);cout << ans << '\n';}else if (m == n){vector<int> id(n);iota(id.begin(), id.end(), 0);int ignore = 0;function<int(int)> findfa = [&](int x){return x == id[x] ? x : id[x] = findfa(id[x]);};for(int i = 0; i < m; ++ i){int u = edges[i][0], v = edges[i][1];int fu = findfa(u), fv = findfa(v);if (fu == fv){ignore = i;break;}id[fu] = fv;}vector<vector<LL>> dp(n, vector<LL>(k, 0));LL ans = inf;int fixed = edges[ignore][0], st = edges[ignore][1];for(int col = 0; col < k; ++ col){for(auto &i : dp)fill(i.begin(), i.end(), 0);function<void(int, int)> dfs = [&](int u, int fa){for(auto e : edge[u]){int v = e[0], id = e[1];if (v == fa || id == ignore)continue;dfs(v, u);for(int i = 0; i < k; ++ i){if (u == fixed && i != col)continue;LL tmp = inf;for(int j = 0; j < k; ++ j){if (v == fixed && j != col)continue;int L = i, R = j;if (u != edges[id][0])swap(L, R);int r = L * k + R;tmp = min(tmp, dp[v][j] + pcost[v][j] + ecost[id][r]);}dp[u][i] += tmp;}}};dfs(st, st);for(int i = 0; i < k; ++ i){int L = i, R = col;if (st != edges[ignore][0])swap(L, R);int r = L * k + R;ans = min(ans, dp[st][i] + pcost[st][i] + ecost[ignore][r]);}}cout << ans << '\n';}else{vector<int> du(n);for(int i = 0; i < m; ++ i){int u = edges[i][0], v = edges[i][1];++ du[u];++ du[v];}int target = 0;for(int i = 0; i < n; ++ i){if (m - du[i] == n - 2){target = i;break;}}vector<int> forbid(n, 0);for(auto &e : edge[target]){int v = e[0];forbid[v] = 1;}int st = 0;while(st == target || forbid[st])++ st;vector<vector<LL>> dp(n, vector<LL>(k, 0));LL ans = inf;for(int col = 0; col < k; ++ col){for(auto &i : dp)fill(i.begin(), i.end(), 0);function<void(int, int)> dfs = [&](int u, int fa){for(auto e : edge[u]){int v = e[0], id = e[1];if (v == fa)continue;if (v != target)dfs(v, u);for(int i = 0; i < k; ++ i){LL tmp = inf;for(int j = 0; j < k; ++ j){if (v == target && j != col)continue;int L = i, R = j;if (u != edges[id][0])swap(L, R);int r = L * k + R;if (v == target){tmp = min(tmp, 1ll * ecost[id][r]);}else{tmp = min(tmp, dp[v][j] + pcost[v][j] + ecost[id][r]);}}dp[u][i] += tmp;}}};dfs(st, st);for(int i = 0; i < k; ++ i){ans = min(ans, dp[st][i] + pcost[st][i] + pcost[target][col]);}}cout << ans << '\n';}return 0;
}

 运行结果:

这篇关于CCF-CSP真题《202305-4 电力网络》思路+python,c++满分题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr