当前位置: 面试刷题>> 图中两个点之间的路线 (经典算法题500道)
### 题目补充描述
**题目**: 在一个无向图中,给定两个节点(顶点)`start` 和 `end`,以及图的所有边(以节点对的形式给出),请编写一个算法来找到从 `start` 到 `end` 的一条路径(如果存在的话)。如果有多条路径,返回任意一条即可。如果不存在路径,则返回空或表示不存在的信息。
### 示例
**输入**:
- 图的边(以节点对形式给出):`[(0, 1), (1, 2), (2, 3), (3, 4), (4, 0), (1, 3)]`
- 起始节点:`0`
- 目标节点:`4`
**输出**:
- 路径:`[0, 1, 3, 4]`
### 解题思路
这个问题可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来解决。这里,我将使用深度优先搜索(DFS)来提供一个解决方案,因为它在找到一条路径时就能立即返回,而不需要遍历整个图。
### PHP 示例代码
```php
function findPathDFS($graph, $start, $end, &$visited = [], &$path = []) {
$visited[$start] = true;
$path[] = $start;
if ($start == $end) {
return $path;
}
foreach ($graph[$start] ?? [] as $neighbor) {
if (!$visited[$neighbor]) {
$result = findPathDFS($graph, $neighbor, $end, $visited, $path);
if ($result) {
return $result;
}
}
}
// 回溯
array_pop($path);
unset($visited[$start]);
return [];
}
// 示例图的表示方式,使用邻接表
$graph = [
0 => [1, 4],
1 => [0, 2, 3],
2 => [1, 3],
3 => [2, 1, 4],
4 => [3, 0]
];
$start = 0;
$end = 4;
$path = findPathDFS($graph, $start, $end);
print_r($path);
```
**注意**: PHP 示例中,我假设图以邻接表的形式给出,因为 PHP 的数组可以方便地表示这种结构。
### Python 示例代码
```python
def find_path_dfs(graph, start, end, visited=None, path=None):
if visited is None:
visited = set()
if path is None:
path = []
visited.add(start)
path.append(start)
if start == end:
return path
for neighbor in graph[start]:
if neighbor not in visited:
result = find_path_dfs(graph, neighbor, end, visited, path)
if result:
return result
# 回溯
path.pop()
visited.remove(start)
return []
# 示例图的表示方式,使用邻接表
graph = {
0: [1, 4],
1: [0, 2, 3],
2: [1, 3],
3: [2, 1, 4],
4: [3, 0]
}
start = 0
end = 4
path = find_path_dfs(graph, start, end)
print(path)
```
### JavaScript 示例代码
```javascript
function findPathDFS(graph, start, end, visited = new Set(), path = []) {
visited.add(start);
path.push(start);
if (start === end) {
return path;
}
for (let neighbor of graph[start] || []) {
if (!visited.has(neighbor)) {
const result = findPathDFS(graph, neighbor, end, visited, path);
if (result) {
return result;
}
}
}
// 回溯
path.pop();
visited.delete(start);
return [];
}
// 示例图的表示方式,使用邻接表
const graph = {
0: [1, 4],
1: [0, 2, 3],
2: [1, 3],
3: [2, 1, 4],
4: [3, 0]
};
const start = 0;
const end = 4;
const path = findPathDFS(graph, start, end);
console.log(path);
```
**码小课** 网站中有更多关于图论、算法和数据结构的相关内容分享给大家学习,欢迎访问以获取更多知识。