DFS你可以当成树的先根遍历来做,BFS你可以当做树的层次遍历来做,这里因为图不一定是连通图,所以每个顶点都要尝试一下,用一个BOOL数组来表示这个顶点是否经历过遍历。(这个编辑器插入代码段为啥只能是黑色)
#include<iostream>
#include<queue>
using namespace std;
typedef char VertexType;
typedef int EdgeType;
const int MAXVEX = 100;
const int INFINITY = 65535;
typedef struct
{
VertexType vexs[MAXVEX];
EdgeType arc[MAXVEX][MAXVEX];
int numVertexes,numEdges;
}MGraph;
/*
建立无向网图的邻接矩阵表示
*/
void CreateMGraph_Undirected(MGraph *G)
{
int i,j,k,w;
cout<<"请输入顶点数和边数:"<<endl;
cin>>G->numVertexes>>G->numEdges;
cout<<"请输入顶点名称:"<<endl;
for(i = 0;i < G->numVertexes;++i)//输入顶点
{
cin>>G->vexs[i];
}
for(i = 0;i < G->numVertexes;++i)//初始化邻接矩阵,除对角线元素 = 0,其余为INFINITY;
{
for(j = 0;j < G->numVertexes;++j)
{
if(i == j)
{
G->arc[i][j] = 0;
}
else
{
G->arc[i][j] = INFINITY;
}
}
}
for(k = 0;k < G->numEdges;++k)//完成邻接矩阵的填写工作
{
printf("请输入边(vi,vj)上的下标i,下标j和权w:\n");
cin>>i>>j>>w;
G->arc[i][j] = G->arc[j][i] = w;
}
}
void ShowMGraph(MGraph *G)//打印图的信息
{
cout<<"图的顶点,边数为:"<<G->numVertexes<<G->numEdges<<endl;
cout<<"邻接矩阵为:"<<endl;
for(int i = 0;i < G->numVertexes;++i)
{
for(int j = 0;j < G->numVertexes;++j)
{
if(G->arc[i][j] == INFINITY)
{
cout<<"# ";
}
else
{
cout<<G->arc[i][j]<<" ";
}
}
cout<<endl;
}
}
/*
建立有向网图的邻接矩阵表示
*/
void CreateMGraph_Directed(MGraph *G)
{
int i,j,k,w;
cout<<"请输入顶点数和边数:"<<endl;
cin>>G->numVertexes>>G->numEdges;
cout<<"请输入顶点名称:"<<endl;
for(i = 0;i < G->numVertexes;++i)//输入顶点
{
cin>>G->vexs[i];
}
for(i = 0;i < G->numVertexes;++i)//初始化邻接矩阵,除对角线元素 = 0,其余为INFINITY;
{
for(j = 0;j < G->numVertexes;++j)
{
if(i == j)
{
G->arc[i][j] = 0;
}
else
{
G->arc[i][j] = INFINITY;
}
}
}
for(k = 0;k < G->numEdges;++k)//完成邻接矩阵的填写工作
{
printf("请输入边<vi,vj>上的下标i,下标j和权w:\n");
cin>>i>>j>>w;
G->arc[i][j] = w;
}
}
typedef bool Boolean;
Boolean visited[MAXVEX];
//邻接矩阵的DFS递归算法
void DFS(MGraph G,int i)
{
visited[i] = true;
cout<< G.vexs[i]<<"->";
for(int j = 0;j < G.numVertexes;++j)
{
if(!visited[j] && G.arc[i][j] < INFINITY)
{
DFS(G,j);
}
}
}
//邻接矩阵的DFS遍历操作
void DFSTraverse(MGraph G)
{
int i;
for(i = 0;i < G.numVertexes;++i)
{
visited[i] = false;
}
for(i = 0;i < G.numVertexes;++i)
{
if(!visited[i])
{
DFS(G,i);
}
}
cout<<endl;
}
//邻接矩阵的BFS遍历操作
void BFSTraverse(MGraph G)
{
queue<int> Q;
int i,j,k;
for(i = 0;i < G.numVertexes;++i)
{
visited[i] = false;
}
for(i = 0;i < G.numVertexes;++i)
{
if(!visited[i])
{
visited[i] = true;
Q.push(i);
while(!Q.empty())
{
j = Q.front();
Q.pop();
cout<< G.vexs[j]<<"->";
for(k = 0;k < G.numVertexes;++k)
{
if(!visited[k] && G.arc[j][k] < INFINITY)
{
visited[k] = true;
Q.push(k);
}
}
}
}
}
cout<<endl;
}
int main()
{
MGraph *G = new MGraph();
CreateMGraph_Directed(G);
ShowMGraph(G);
DFSTraverse(*G);
BFSTraverse(*G);
delete G;
}