- 《大话数据结构》读书笔记+课程补充
- 每日一个例题示范
一、读书笔记+课程补充
(50页)
分析算法时间复杂度的基本方法 尽量简化
取数量级符号"O"
选择最高次 再化简O(n^2)
时间复杂度是由嵌套最深层语句的频度决定的。
分析时间复杂度的例题 循环执行推导:找到执行次数
最后取时间复杂度为T(n)=O(log2 n)
二、每日一个例题示范
高手去散步
题目描述
鳌头山上有 �n 个观景点,观景点两两之间有游步道共 �m 条。高手的那个它,不喜欢太刺激的过程,因此那些没有路的观景点高手是不会选择去的。另外,她也不喜欢去同一个观景点一次以上。而高手想让他们在一起的路程最长(观景时它不会理高手),已知高手的穿梭机可以让他们在任意一个观景点出发,也在任意一个观景点结束。
输入格式
第一行,两个用空格隔开的整数 �n 、 �.m. 之后 �m 行,为每条游步道的信息:两端观景点编号、长度。
输出格式
一个整数,表示他们最长相伴的路程。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int INF = 1e9;
int main() {
int n, m;
cin >> n >> m;
// 创建邻接矩阵表示图,初始化为无穷大
vector<vector<int>> graph(n + 1, vector<int>(n + 1, INF));
// 读取游步道的信息
for (int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
graph[u][v] = graph[v][u] = w; // 无向图
}
// 使用动态规划计算最短路径
for (int k = 1; k <= n; ++k) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
}
}
}
// 寻找最长相伴的路程
int result = 0;
for (int i = 1; i <= n; ++i) {
for (int j = i + 1; j <= n; ++j) {
if (graph[i][j] != INF) {
result = max(result, graph[i][j]);
}
}
}
cout << result << endl;
return 0;
}
分析:头文件是标准库中的
定义常量表示无穷大 用于初始化邻接矩阵中的距离 表示两节点之间无直接连接
标准输入读取两个整数 n和m
然后读取周边步道信息
最后寻找最长相伴路程。