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

 运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LIME低亮度图像增强

LIME低亮度图像增强 main.cpp #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <opencv2/imgproc/imgproc.hpp> #include "lime.h"int main() {cv::Mat img_in cv::imread("…

二维空间与三维空间的姿态表示法

二维空间与三维空间的姿态表示法 一、2D空间姿态表示法二、3D空间姿态表示法2.1 三个数表示空间姿态问题 2.2 九个数表示空间姿态问题 2.3 四个数表示空间姿态 结语Reference 假设&#xff0c;你有志成为我空军某航空旅歼-20飞行员&#xff0c;但要想开好飞机&#xff0c;那就得…

简单-【1 绪论】

关键字&#xff1a; 数据类型、数据结构定义、递归关键、线性结构、非线性结构、算法特性、算法目标、时间复杂度排序

【Vue.js】Vue3全局配置Axios并解决跨域请求问题

系列文章目录 文章目录 系列文章目录背景一、部署Axios1. npm 安装 axios2. 创建 request.js&#xff0c;创建axios实例3. 在main.js中全局注册axios4. 在页面中使用axios 二、后端解决跨域请求问题方法一 解决单Contoller跨域访问方法二 全局解决跨域问题 背景 对于前后端分离…

JavaEE-博客系统2(功能设计)

本部分内容&#xff1a;实现博客列表页&#xff1b;web程序问题的分析方法&#xff1b;实现博客详情页&#xff1b; 该部分的代码如下&#xff1a; WebServlet("/blog") public class BlogServlet extends HttpServlet {//Jackson ObjectMapper类(com.fasterxml.jac…

Nignx安装负载均衡动静分离以及Linux前端项目部署将域名映射到特定IP地址

目录 一、nginx简介 1.1 定义 1.2 背景 1.3 作用 二、nginx搭载负载均衡提供前后分离后台接口数据 2.1 nginx安装 2.1.1 下载依赖 2.1.2 下载并解压安装包 2.1.3 安装nginx 2.1.4 启动nginx服务 2.2 tomcat负载均衡 2.2.1 负载均衡所需服务器准备 2.2.2 配置修改 …

【漏洞复现】Metinfo5.0.4任意文件包含漏洞复现

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1、蚁剑直接连接图片马2、读取敏感目录3、读取php源码4、执行PHP命令5、包含木马写Shell &#xff08;图片马制作新方法&#xff09; 以 metinfo_5.0.4为例 该环境的文件上传…

关于编程不得不说的事

这些年&#xff0c;互联网爆炸式的发展&#xff0c;促生了无数程序员&#xff0c;也促生了大量 IT培训机构。短短数年间&#xff0c;科班出生的程序员和培训机构出生的程序员呈指数增长。程序员的职业也不再是金饭碗。写了这么多代码&#xff0c;有些感触&#xff0c;所以写下来…

32 mysql in 的实现

前言 这里我们主要是来探讨一下 mysql 中 in 的使用, find_in_set 的使用 这两者 在我们实际应用中应该也是 非常常用的了 测试数据表如下 CREATE TABLE tz_test (id int(11) unsigned NOT NULL AUTO_INCREMENT,field1 varchar(16) DEFAULT NULL,field2 varchar(16) DEFAU…

SpringBoot集成JPA实现分页和CRUD

SpringBoot集成JPA实现分页和CRUD 文章目录 SpringBoot集成JPA实现分页和CRUDpom.xmlapplication.propertiesaddCategory.jspeditCategory.jsphello.jsplistCategory.jspCategoryCategoryDAOCategoryServiceCategoryServiceImplPage4NavigatorRedisConfigCategoryControllerHel…

剑指JUC原理-12.手写简易版线程池思路

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

Ubuntu20.04搭建RISC-V和qemu环境

1. 前言 risc-v是一个非常有潜力的指令集框架&#xff0c;最近对其产生了浓厚的兴趣&#xff0c;由于之前对于这方面的知识储备很少&#xff0c;在加上网上的教程都是点到为止&#xff0c;所以安装过程异常曲折。好在最后一步一步积累摸索&#xff0c;终于利用源码安装完成。看…