为了简单,本程序只简单用0 1 2 3 4.....来表示顶点。
#include<iostream>
#include<queue>
#define MAX_Vertex 100
using namespace std;
//广度优先算法实现
typedef struct Graph{
int data[MAX_Vertex][MAX_Vertex];
int V_num,E_num; //定义定点数和边数
}Graph;
int visited[MAX_Vertex] = {0}; //标识该点是否访问了
void Init_graph(Graph *g){
int n;
cout << "Please input V num:\n";
cin >> n;
g->V_num = n;
g->E_num = 0;
cout << "Please input Adjacency matrix(size:Vnum * Vnum):" << endl;
for(int i = 0; i < n; i++){
for(int j = 0; j < n ; j++){
cin >> g->data[i][j];
if(g->data[i][j] != 0){
g->E_num++;
}
}
}
}
int FirstNeighbor(Graph g,int v){
for(int i = 0; i < g.V_num; i++){
if(g.data[v][i] != 0){
return i;
}
}
return -1;
}
int NextNeighbor(Graph g,int v,int w){
for(int i = w + 1; i < g.V_num; i++){
if(g.data[v][i] != 0){
return i;
}
}
return -1;
}
void BFS(Graph g,int v){
queue<int> q; //辅助队列
q.push(v); //该连通分量的起点入队
visited[v] = 1;
while(!q.empty()){
v = q.front();
cout << v << " "; //相当于visit(v)
q.pop();
for(int w = FirstNeighbor(g,v);w >= 0; w = NextNeighbor(g,v,w)){
if(!visited[w]){
q.push(w);
visited[w] = 1;
}
}
}
}
void BFSTraverse(Graph g){
for(int i = 0;i < g.V_num; i++){
visited[i] = 0;
}
for(int i = 0 ; i < g.V_num; i++){ //BFS执行几次,就说明有几个连通分量或强连通分量
if(visited[i] == 0){
BFS(g,i);
}
}
}
void DFS(Graph g,int v){
cout << v << " ";
visited[v] = 1;
for(int w = FirstNeighbor(g,v);w >= 0; w = NextNeighbor(g,v,w)){
if(!visited[w]){
DFS(g,w);
}
}
}
void DFSTraverse(Graph g){
for(int i = 0;i < g.V_num; i++){ //将visited数组
visited[i] = 0;
}
for(int i = 0 ; i < g.V_num; i++){ //BFS执行几次,就说明有几个连通分量或强连通分量
if(visited[i] == 0){
DFS(g,i);
}
}
}
int main(){
Graph g;
Init_graph(&g);
//广度优先遍历序列
cout << "BFS :" << endl;
BFSTraverse(g);
cout << endl;
//深度优先遍历序列
cout << "DFS:" << endl;
DFSTraverse(g);
cout << endl;
return 0;
}