1.建立图的邻接矩阵和邻接表; 2.以邻接表作存储结构,分别对图输出深度优先搜索和广度优先搜 索遍历序列; 3.利用遍历算法判断图中的两个顶点之间是否存在路径。 完整C++代码
时间: 2024-12-24 09:25:12 浏览: 0
数据结构图的邻接矩阵,邻接表存储表示,图的深度优先搜索遍历,广度优先搜索遍历
1. **建立图的邻接矩阵和邻接表**:
- 邻接矩阵:是一种二维数组,其中行代表起点,列代表终点,每个元素表示两点间是否有边。如果(i, j)位置的值为1,则表示从i到j有边;0则无边。矩阵大小通常是VxV,其中V是顶点数。
- 邻接表:每个顶点对应一个链表,链表中的节点包含相邻顶点的信息。通过节点指针可以快速访问某个顶点的所有邻居。
2. **以邻接表进行DFS和BFS遍历(C++代码示例)**:
```cpp
// DFS (深度优先搜索)
vector<vector<int>> adj; // 邻接表
void dfs(int u, vector<bool>& visited, vector<int>& path) {
visited[u] = true;
path.push_back(u);
for (int v : adj[u]) {
if (!visited[v]) {
dfs(v, visited, path);
}
}
}
// 输出DFS路径
void printDFSPath(int start, int end) {
vector<int> path;
dfs(start, vector<bool>(adj.size(), false), path);
cout << "DFS Path: ";
for (int i : path) {
cout << i << " -> ";
}
cout << end << endl;
}
// BFS (广度优先搜索)
queue<int> bfs_queue;
void bfs(int start, vector<bool>& visited, vector<int>& path) {
visited[start] = true;
path.push_back(start);
bfs_queue.push(start);
while (!bfs_queue.empty()) {
int u = bfs_queue.front();
bfs_queue.pop();
for (int v : adj[u]) {
if (!visited[v]) {
visited[v] = true;
path.push_back(v);
bfs_queue.push(v);
}
}
}
}
// 输出BFS路径
void printBFSPath(int start, int end) {
vector<int> path;
bfs(start, vector<bool>(adj.size(), false), path);
cout << "BFS Path: ";
for (int i : path) {
cout << i << " -> ";
}
cout << end << endl;
}
```
3. **判断两点间是否存在路径(C++代码)**:
利用DFS或BFS遍历结束后,如果目标节点出现在路径中,说明存在路径。如果没有找到目标节点,返回false。
```cpp
bool hasPath(int start, int end) {
vector<bool> visited(adj.size(), false);
return dfs(start, visited, vector<int>()) != end ||
bfs(start, visited, vector<int>()) != end;
}
```
阅读全文