用c++写出一个算法确定一个有n个点 e条边的图(有向图或者图)是否包含路,所设计的算法的时间复杂度应该是 0(n +e)。
时间: 2024-05-08 15:21:46 浏览: 75
试完成求有向图的强连同分量的算法,并分析算法的时间复杂度
这里介绍一种基于深度优先搜索(DFS)的算法,时间复杂度为O(n+e)。
首先,我们需要了解什么是图的路径。在一个有向图中,路径是指从起点到终点的一系列边的组合。如果从起点到终点有一条路径,则称该图包含路。
接下来,我们可以使用DFS算法来判断是否存在路径。具体步骤如下:
1. 选取一个起点,标记为已访问。
2. 遍历该节点的所有邻居节点,如果邻居节点未被访问,则继续递归遍历。
3. 如果找到了终点,则说明存在路径,直接返回true。
4. 如果所有邻居节点都被访问过,则回溯到上一个节点,继续遍历其他邻居节点。
5. 如果遍历完所有节点后仍未找到路径,则返回false。
实现代码如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
bool DFS(int start, int end, vector<vector<int>> graph, vector<bool>& visited) {
visited[start] = true;
if (start == end) return true;
for (int i = 0; i < graph[start].size(); i++) {
int neighbor = graph[start][i];
if (!visited[neighbor]) {
if (DFS(neighbor, end, graph, visited)) return true;
}
}
return false;
}
bool hasPath(int n, int e, vector<vector<int>> edges) {
vector<vector<int>> graph(n + 1, vector<int>());
for (int i = 0; i < edges.size(); i++) {
int u = edges[i][0], v = edges[i][1];
graph[u].push_back(v);
}
vector<bool> visited(n + 1, false);
return DFS(1, n, graph, visited);
}
int main() {
int n = 3, e = 3;
vector<vector<int>> edges = {{1, 2}, {2, 3}, {3, 1}};
bool result = hasPath(n, e, edges);
cout << (result ? "yes" : "no") << endl;
return 0;
}
```
其中,`hasPath`函数接收三个参数:节点数n、边数e、边的列表edges。在该函数中,我们先将边列表转化为邻接表形式的图。然后使用DFS算法判断是否存在路径。最终输出结果为“yes”或“no”。
时间复杂度分析:DFS算法的时间复杂度为O(n+e),所以整个算法的时间复杂度也为O(n+e)。
阅读全文