(1)按照邻接表创建图的结构体;(2)创建一个无向图;(3)对创建好的图进行深度优先或广度优先遍历。
时间: 2024-12-15 08:19:44 浏览: 4
(1) 按照邻接表创建图的结构体通常会包含以下几个部分:顶点集合(Vertex Set),每个顶点对应一个链表存储与其相连的边;以及一个数据结构(如哈希表或列表)用于存放所有的顶点。例如,在C++中,可以定义如下:
```cpp
struct Graph {
int vertices;
vector<vector<int>> adj; // 使用邻接表,adj[i]表示节点i的相邻节点集合
};
```
(2) 创建一个无向图,我们可以先初始化上述的Graph结构,然后通过添加边的方式来表示两个顶点之间的连接。如果边是无向的,即A到B有边,那么B到A也应该有一条边。例如,可以用以下步骤创建:
```cpp
Graph graph(5); // 初始化5个顶点
graph.adj[0].push_back(1); // 顶点0与1互连
graph.adj[1].push_back(0); // 顶点1也连接到顶点0
// ... 添加更多顶点间的无向边...
```
(3) 对图进行深度优先搜索(DFS)或广度优先搜索(BFS),可以分别定义递归或非递归函数来实现。以下是基本的DFS示例:
```cpp
void dfs(Graph& g, int start) {
// ... 具体的访问操作和标记已访问顶点的代码 ...
for (int neighbor : g.adj[start]) {
if (!visited[neighbor]) { // 如果邻居未访问过
visited[neighbor] = true; // 标记访问
dfs(g, neighbor); // 递归调用 DFS
}
}
}
```
对于BFS,可以使用队列来进行:
```cpp
void bfs(Graph& g, int start) {
queue<int> q;
q.push(start);
while (!q.empty()) {
int vertex = q.front();
q.pop();
// ... 访问并标记节点 ...
for (int neighbor : g.adj[vertex]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
q.push(neighbor);
}
}
}
}
```
阅读全文