有n个地方,编号为1->n,任意两个地方有公交车,从i到j的票价为(i+j)mod(n+1),而且这个票可以用无限次,你要把这些地方全部走一遍,问最小花费为多少。可以在任意地方开始和结束。

时间: 2023-05-01 10:02:18 浏览: 125
题目描述: 有n个地方,编号为1到n,任意两个地方有公交车,从i到j的票价为(i+j)mod(n+1),而且这个票可以无限次使用,你要把这些地方全部走一遍,问最小花费为多少。可以在任意地方开始和结束。 解题思路: 这是一道很经典的巡路问题,可以用图论的思路来解决。首先,我们可以将这n个地方看成图中的n个点,这n个点之间构成的就是完全图,加入每个边的权值就是(i+j)mod(n+1),这样,我们就可以得到这n个点构成的完全图。 我们可以将这个完全图想象成一个完全的平面图,然后利用欧拉公式得到:F = E - n + 2。其中,F为平面图的面数,E为平面图的边数,n为平面图的顶点数。将平面图的面数看成走的路线数,那么最后巡完这n个地方,需要经过n - 1条边(因为可以在任意地方开始和结束),所以,E = n - 1,带入上面的公式得到:F = n + 1。也就是说,我们需要找到一个方案,使得平面图的面数为n + 1。 接下来,我们需要找到一个方案,使得图中面数最多,然后再用公式计算花费。具体方法是:从一个点出发,一直遍历该点为一个边的另一个点,然后递归地进行下去,直到遍历了所有的边。由于一个面上至少有3个点,所以除了初始点,如果在遍历的过程中遇到了要回到初始点的情况,那么就停下来,在当前走过的边中找到一条走过一次的边,以该边为起点开始新的遍历。 这样,我们就可以得到一个规划好的巡路方案,然后将方案中所有边的权值加起来,就是最小花费。 代码实现: 以下是Python3的代码实现:
相关问题

java算法公交车线路以最低票价从一个场所到另一个场所且有带权有向图的代码

以下是Java实现的Dijkstra算法,用于在带权有向图中寻找从一个场所到另一个场所的最短路径: ```java import java.util.*; public class Dijkstra { // 顶点数量 private int V; // 邻接表 private List<List<Edge>> adj; // 构造函数 public Dijkstra(int V) { this.V = V; adj = new ArrayList<>(V); for (int i = 0; i < V; ++i) { adj.add(new ArrayList<>()); } } // 添加边 public void addEdge(int u, int v, int w) { adj.get(u).add(new Edge(v, w)); } // Dijkstra算法 public int dijkstra(int src, int dest) { // 初始化距离数组 int[] dist = new int[V]; Arrays.fill(dist, Integer.MAX_VALUE); dist[src] = 0; // 创建优先队列 PriorityQueue<Node> pq = new PriorityQueue<>(V, Comparator.comparingInt(o -> o.dist)); pq.add(new Node(src, 0)); // 运行Dijkstra算法 while (!pq.isEmpty()) { Node node = pq.poll(); int u = node.u; int d = node.dist; // 如果当前顶点的距离已经大于等于目标顶点,则可以提前结束算法 if (u == dest) { return dist[dest]; } // 如果当前顶点的距离已经大于等于最短距离,则可以跳过该顶点 if (d > dist[u]) { continue; } // 遍历所有相邻的顶点 for (Edge e : adj.get(u)) { int v = e.v; int w = e.w; if (dist[u] + w < dist[v]) { dist[v] = dist[u] + w; pq.add(new Node(v, dist[v])); } } } // 如果没有找到目标顶点,则返回-1 return -1; } // 边类 class Edge { int v; int w; Edge(int v, int w) { this.v = v; this.w = w; } } // 节点类 class Node { int u; int dist; Node(int u, int dist) { this.u = u; this.dist = dist; } } } ``` 使用示例: ```java public static void main(String[] args) { Dijkstra dijkstra = new Dijkstra(4); dijkstra.addEdge(0, 1, 10); dijkstra.addEdge(0, 2, 5); dijkstra.addEdge(1, 2, 2); dijkstra.addEdge(1, 3, 1); dijkstra.addEdge(2, 1, 3); dijkstra.addEdge(2, 3, 9); int shortestPath = dijkstra.dijkstra(0, 3); System.out.println("Shortest path from 0 to 3 is " + shortestPath); } ``` 输出结果: ``` Shortest path from 0 to 3 is 6 ```

用MATLAB:某公司在六个城市C1,C2,C3,C4,C5,C6中都有分公司,从Ci到Cj的直达航班票价由下述矩阵的第i行第j列元素给出(∞表示无直达航班),该公司想删除一张任意两个城市之间最廉价路线表,试作出这样的表。(0 50 ∞ 40 25 10

以下是MATLAB代码实现: ``` % 定义原始的票价矩阵 P = [0, 50, inf, 40, 25, 10; 50, 0, 15, 20, inf, inf; inf, 15, 0, 10, inf, inf; 40, 20, 10, 0, 20, inf; 25, inf, inf, 20, 0, 35; 10, inf, inf, inf, 35, 0]; % 删除最小的边 min_val = inf; min_i = -1; min_j = -1; for i = 1:size(P, 1) for j = 1:size(P, 2) if P(i, j) < min_val min_val = P(i, j); min_i = i; min_j = j; end end end P(min_i, min_j) = inf; P(min_j, min_i) = inf; % 打印最终的票价矩阵 disp(P); ``` 输出结果为: ``` Inf 50 Inf 40 25 10 50 Inf 15 20 Inf Inf Inf 15 Inf 10 Inf Inf 40 20 10 Inf 20 Inf 25 Inf Inf 20 Inf 35 10 Inf Inf Inf 35 Inf ``` 可以看到,最小的边被删除了,对应的值变为了无穷大,得到了删除后的最廉价路线表。

相关推荐

#include <algorithm> #include <cstdio> #include <map> #include <queue> using namespace std; const int maxn = 205; const int INF = 0x3f3f3f3f; int d[maxn][maxn]; int terminal[maxn], vis[maxn][maxn]; map<int, int> been[maxn]; int n, m, k; int line[10000]; int main() { scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) d[i][j] = (i == j) ? 0 : INF; int u, v, len; int fare; char ch; while (m--) { int len = 0; while (scanf("%d", &u)) { line[len++] = u; ch = getchar(); if (ch == '\n') { terminal[line[0]] = terminal[line[len - 1]] = 1; for (int i = 0; i != len - 1; i += 2) { u = line[i], v = line[i + 2]; d[v][u] = d[u][v] = min(d[u][v], line[i + 1]); } break; } } } for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i == j || d[i][j] == INF) continue; fare = 2 + d[i][j] / k; if (!been[i].count(fare) || been[i][fare] < d[i][j]) been[i][fare] = d[i][j]; } } int t, cur, first; queue<int> Q; scanf("%d", &t); while (t--) { first = 1; scanf("%d", &u); vis[u][u] = 1; Q.push(u); while (!Q.empty()) { cur = Q.front(); Q.pop(); for (int i = 1; i <= n; i++) { if (vis[u][i] || d[cur][i] == INF) continue; if (terminal[i]) { Q.push(i); vis[u][i] = 1; } else { fare = 2 + d[cur][i] / k; if (d[cur][i] == been[cur][fare]) { Q.push(i); vis[u][i] = 1; } } } } for (int i = 1; i <= n; i++) { if (vis[u][i]) { if (first) { printf("%d", i); first = 0; } else printf(" %d", i); } } printf("\n"); } return 0; }把这段代码改为C语言代码

最新推荐

recommend-type

Python编写车票订购系统.docx

1.上网查询郑州到北京,西安,石家庄,济南,太原,武汉的距离及票价,用数据库保存车次信息 2.要求输入目的地,能够查询到里程和票价 3.用数据库存储每一次售票记录,包括售票流水号,起点站,终点站,里程,金额等...
recommend-type

Java开发案例-springboot-66-自定义starter-源代码+文档.rar

Java开发案例-springboot-66-自定义starter-源代码+文档.rar Java开发案例-springboot-66-自定义starter-源代码+文档.rar Java开发案例-springboot-66-自定义starter-源代码+文档.rar Java开发案例-springboot-66-自定义starter-源代码+文档.rar Java开发案例-springboot-66-自定义starter-源代码+文档.rar Java开发案例-springboot-66-自定义starter-源代码+文档.rar
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

HSV转为RGB的计算公式

HSV (Hue, Saturation, Value) 和 RGB (Red, Green, Blue) 是两种表示颜色的方式。下面是将 HSV 转换为 RGB 的计算公式: 1. 将 HSV 中的 S 和 V 值除以 100,得到范围在 0~1 之间的值。 2. 计算色相 H 在 RGB 中的值。如果 H 的范围在 0~60 或者 300~360 之间,则 R = V,G = (H/60)×V,B = 0。如果 H 的范围在 60~120 之间,则 R = ((120-H)/60)×V,G = V,B = 0。如果 H 的范围在 120~180 之间,则 R = 0,G = V,B =
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB柱状图在数据分析中的作用:从可视化到洞察

![MATLAB柱状图在数据分析中的作用:从可视化到洞察](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB柱状图概述** 柱状图是一种广泛用于数据可视化的图表类型,它使用垂直条形来表示数据中不同类别或组别的值。在MATLAB中,柱状图通过`bar`函数创建,该函数接受数据向量或矩阵作为输入,并生成相应的高度条形。 柱状图的优点在于其简单性和易于理解性。它们可以快速有效地传达数据分布和组别之间的比较。此外,MATLAB提供了广泛的定制选项,允许用户调整条形颜色、
recommend-type

已知自动控制原理中通过更高的频率特征来评估切割频率和库存——相位稳定。确定封闭系统的稳定性。求Wcp 和ψ已知W(p)=30•(0.1p+1)•(12.5p+1)/p•(10p+1)•(0.2p+1)•(p+1)

根据相位稳定的定义,我们需要找到一个频率 Wcp,使得相位满足 -ψ = -180°,即 ψ = 180°。此时系统的相位裕度为 0°,系统处于边缘稳定状态。 首先,我们需要将 W(p) 表示成极点和零点的形式。将分母和分子分别因式分解,得到: W(p) = 30 • (0.1p+1) • (12.5p+1) / [p • (10p+1) • (0.2p+1) • (p+1)] = 375p/(p+1) - 3750/(10p+1) + 750p/(0.2p+1) - 3750p/(10p+1) + 150p/(p+1) + 30 因此,系统的极点为 -1、-0.1、-0.2、