1. 在数据结构中对于图的存储主要有三种方式,分别为邻接矩阵,邻接表和边集,前两种比较常用,下面使用的是C++语言邻接矩阵来存储图并实现广度优先搜索遍历
2. 下面是具体的实现过程:
① 实现邻接矩阵存储图主要是使用的二维数组来存储从起始顶点到结束顶点相应的值即可,假如是无向图来说我们需要从起始顶点和结束顶点两端进行标记,经常的做法是标记为1表示,即graph[u][v] = 1和graph[v][u] = 1假如是有权图的话那么数组里面可以存放边的权重
② 这里使用二维数组来存储有向有权图,在输入数据的时候我们可以将对应的起点和终点的位置存储对应的权重即可,对于邻接矩阵相比于邻接矩阵来说比较容易操作
③ 存储好了图之后那么我们需要对图进行广度优先搜索,对于广度优先搜索我们需要借助于队列来进行图的遍历操作,弹出一个节点,加入若干个的邻居节点那么就可以实现图的广度优先遍历,因为图有可能存在环路,所以此时还需要设置一个标记数组来比较当前的顶点是否被访问过了
具体的图如下:
测试数据如下:
6
8
0 1 1
0 2 2
0 3 4
1 2 5
2 3 9
2 4 9
2 5 6
4 5 2
3. 下面是具体的代码:
#include<stdio.h>
#include<iostream>
#include<queue>
#define maxSize 1000
#define INF 100000000
using namespace std;
bool inq[maxSize] = {false};
int n, edges, G[maxSize][maxSize];
void bfs(int u){
queue<int> q;
q.push(u);
inq[u] = true;
while(!q.empty()){
int u = q.front();
cout << u << " ";
q.pop();
for(int v = 0; v < n; v++){
if(inq[v] == false && G[u][v] != INF){
q.push(v);
inq[v] = true;
}
}
}
}
int main(void){
cout << "输入图中的顶点数: ";
cin >> n;
//先初始化G数组为INF
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
G[i][j] = INF;
}
}
cout << endl;
cout << "输入图中的边数: ";
cin >> edges;
cout << endl << "输入图中的起始顶点, 结束顶点和边的权重: " << endl;
int u = -1, v = -1, weight = -1;
for(int i = 0; i < edges; i++){
cin >> u >> v >> weight;
G[u][v] = weight;
}
bfs(0);
return 0;
}