自定义函数:
- 结构体,包含信息有去往的点和这一段的长度
- 结构体二维数组储存信息
- bool函数标记用没用过
- 初始最大距离为0
- dfs{标记该点,递归比他大的则更新,循环(看有无越界和有无背标记,没有则从该点开始新的dfs),回溯上一个点}
主函数:
- 输入节点和总边数
- 初始化(深搜越界的说明)
- 输入每两个点之间的信息(题目给定的是前后点和长度,这里还要联想到结构体。因为每两个点之间包含的信息有通往哪个点和每两个点之间的长度)
- 初始化标记数组(两层循环,外层为n个节点,内层是以该点开始深搜时,全部都要初始化为未标记过才行),该点开始深搜
| 1 2 3 4
----|----------------
1 | -1 10 50 40
2 | 10 -1 20 60
3 | 50 20 -1 30
4 | 40 60 30 -1
#include <stdio.h>
#include <stdbool.h>
#define MAXN 20
struct Edge {
int v, length;
};
struct Edge adj[MAXN][MAXN];
bool visited[MAXN];
int maxDistance = 0;
void dfs(int u, int currentDistance) {
visited[u] = true;
if (currentDistance > maxDistance) {
maxDistance = currentDistance;
}
for (int i = 0; i < MAXN; i++) {
if (adj[u][i].v != -1 && !visited[adj[u][i].v]) {
dfs(adj[u][i].v, currentDistance + adj[u][i].length);
}
}
visited[u] = false; // 回溯,取消标记
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < MAXN; i++) {
for (int j = 0; j < MAXN; j++) {
adj[i][j].v = -1; // 初始化邻接矩阵
}
}
for (int i = 0; i < m; i++) {
int u, v, length;
scanf("%d %d %d", &u, &v, &length);
adj[u][v].v = v;//链接到的下一个点
adj[u][v].length = length;
adj[v][u].v = u;//这两行说明是排列而不是组合,前后顺序不同,链接的节点不同
adj[v][u].length = length;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < MAXN; j++) {
visited[j] = false; // 初始化标记数组
}
dfs(i, 0);
}
printf("%d\n", maxDistance);
return 0;
}
上面是图例,我们需要更新两边的信息
深度优先搜索是一种图遍历算法,它从起始顶点开始,尽可能深地探索每个分支,直到不能再深入为止,然后回溯到上一个顶点,继续探索其他分支。在这个问题中,DFS 用于找到从每个观景点出发的最长路径。