算法1:输入图的类型、顶点数、狐(边)数、顶点信息、狐(边)信息,建立相应的图(具体类型可以是无向图、有向图、无向网、有向网,采用邻接矩阵存储结构);分别按深度优先搜索和广度优先搜索遍历图;按某种形式输
时间: 2023-11-18 10:03:38 浏览: 158
出遍历结果。
算法实现:
1. 定义一个结构体来存储顶点信息,包括顶点名称、顶点编号等。
```C++
struct Vertex {
string name; // 顶点名称
int index; // 顶点编号
// 其他信息
};
```
2. 定义一个 Graph 类来存储图的信息,包括顶点数、边数、邻接矩阵等。
```C++
class Graph {
private:
int vertexNum; // 顶点数
int edgeNum; // 边数
vector<Vertex> vertexList; // 顶点列表
vector<vector<int>> matrix; // 邻接矩阵
public:
Graph(int vNum, int eNum, vector<Vertex> vList, vector<vector<int>> m) {
vertexNum = vNum;
edgeNum = eNum;
vertexList = vList;
matrix = m;
}
void DFS(); // 深度优先搜索
void BFS(); // 广度优先搜索
};
```
3. 实现图的建立过程,根据用户输入的信息创建相应类型的图,并使用邻接矩阵存储结构来存储图的信息。
```C++
void createGraph() {
int vNum, eNum;
cout << "请输入顶点数和边数:";
cin >> vNum >> eNum;
vector<Vertex> vList(vNum);
vector<vector<int>> m(vNum, vector<int>(vNum, 0));
cout << "请输入每个顶点的信息:" << endl;
for (int i = 0; i < vNum; i++) {
cout << "请输入第 " << i+1 << " 个顶点的名称:";
cin >> vList[i].name;
vList[i].index = i;
}
cout << "请输入每条边的信息:" << endl;
for (int i = 0; i < eNum; i++) {
int start, end, weight;
cout << "请输入第 " << i+1 << " 条边的起点、终点和权值:";
cin >> start >> end >> weight;
m[start][end] = weight;
// 如果是无向图,则需要将邻接矩阵对称
// m[end][start] = weight;
}
Graph graph(vNum, eNum, vList, m);
graph.DFS();
graph.BFS();
}
```
4. 实现深度优先搜索算法。
```C++
void Graph::DFS() {
vector<bool> visited(vertexNum, false); // 记录每个顶点是否已访问
stack<int> s; // 存储待访问的顶点
cout << "深度优先搜索结果:";
// 从第一个顶点开始遍历
s.push(0);
visited[0] = true;
while (!s.empty()) {
int curr = s.top();
s.pop();
cout << vertexList[curr].name << " ";
// 遍历当前顶点的邻接点
for (int j = 0; j < vertexNum; j++) {
if (matrix[curr][j] != 0 && !visited[j]) {
s.push(j);
visited[j] = true;
}
}
}
cout << endl;
}
```
5. 实现广度优先搜索算法。
```C++
void Graph::BFS() {
vector<bool> visited(vertexNum, false); // 记录每个顶点是否已访问
queue<int> q; // 存储待访问的顶点
cout << "广度优先搜索结果:";
// 从第一个顶点开始遍历
q.push(0);
visited[0] = true;
while (!q.empty()) {
int curr = q.front();
q.pop();
cout << vertexList[curr].name << " ";
// 遍历当前顶点的邻接点
for (int j = 0; j < vertexNum; j++) {
if (matrix[curr][j] != 0 && !visited[j]) {
q.push(j);
visited[j] = true;
}
}
}
cout << endl;
}
```
6. 最后,在 main 函数中调用 createGraph 函数来创建图。
```C++
int main() {
createGraph();
return 0;
}
```
这样,就实现了输入图的类型、顶点数、边数、顶点信息、边信息,建立相应的图,并按深度优先搜索和广度优先搜索遍历图,输出遍历结果的算法。
阅读全文