邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
2011-07-27 15:28
981 查看
转载:http://blog.sina.com.cn/s/blog_616694280100f06p.html
图的两种存储方式:邻接矩阵和邻接表;
两种遍历方式:深度优先和广度优先;
首先以一个结构体存储一个图:
struct MGraph
{
int vertex[maxvertex]; //存顶点
int arc[maxvertex][maxvertex]; //存边(邻接矩阵)
int vertexnum,arcnum; //顶点数和边数
};
其次是对图的初始化:
void CreatMGraph(MGraph *&G)
{
int i,j;
cin1>>G->vertexnum>>G->arcnum; //输入顶点数和边数
for(i=0;i<G->vertexnum;i++) //输入每个顶点的值
cin1>>G->vertex[i];
for(i=0;i<G->vertexnum;i++) //初始化邻接矩阵
for(j=0;j<G->vertexnum;j++)
G->arc[i][j]=0;
for(i=0;i<G->arcnum;i++)
{
int n,m,w;
cin1>>n>>m>>w; //修改邻接矩阵中的值
G->arc
[m]=w;
G->arc[m]
=w;
}
}
在此之前需要定义一个全局变量的visited数组:
int visited[maxvertex]; //标记已被访问过的顶点(全局变量)
//广度优先遍历
void BFS(MGraph *&G,int v)
{
queue<int> q;
int x,j;
if(!visited[v]) //即为visited[v]==0,也就是未被访问过
{
cout<<G->vertex[v]<<" ";
visited[v]=1;
q.push(v); //被访问的顶点入队
}
while(!q.empty()) //队不空进循环
{
x=q.front(); //取队头元素
q.pop(); //队头出队
for(j=0;j<G->vertexnum;j++)
if (G->arc[x][j]&&!visited[j])
{
cout<<G->vertex[j]<<" ";
visited[j]=1; //标记为访问过
q.push(j); //被访问的顶点继续入队
}
}
}
//深度优先遍历
void DFS(MGraph *&G,int v)
{
nt j;
if(!visited[v])
{
cout<<G->vertex[v]<<" ";
visited[v]=1; //标记为访问过
}
for(j=0;j<G->vertexnum;j++)
if (G->arc[v][j]&&!visited[j])//邻接矩阵的第(v,j)元素不为0
{ //且未被访问过则递归
DFS(G,j);
}
}
此为图的邻接矩阵的输出函数:
void Print(MGraph *G)
{
int i,j;
for(i=0;i<G->vertexnum;i++)
{
for(j=0;j<G->vertexnum;j++)
cout<<G->arc[i][j]<<" ";
cout<<endl;
}
}
main函数调用上面函数:
int main()
{
MGraph *G=new MGraph;
CreatMGraph(G);
cout<<"输出邻接矩阵:"<<endl;
Print(G);
cout<<"深度优先搜索:";
DFS(G,0);
cout<<endl;
memset(visited,0,sizeof(visited));//非常重要!!在下一个搜索之前一定要将标志位全部重新赋值为0
cout<<"广度优先搜索:";
BFS(G,0);
cout<<endl;
return 0;
}
图的两种存储方式:邻接矩阵和邻接表;
两种遍历方式:深度优先和广度优先;
首先以一个结构体存储一个图:
struct MGraph
{
int vertex[maxvertex]; //存顶点
int arc[maxvertex][maxvertex]; //存边(邻接矩阵)
int vertexnum,arcnum; //顶点数和边数
};
其次是对图的初始化:
void CreatMGraph(MGraph *&G)
{
int i,j;
cin1>>G->vertexnum>>G->arcnum; //输入顶点数和边数
for(i=0;i<G->vertexnum;i++) //输入每个顶点的值
cin1>>G->vertex[i];
for(i=0;i<G->vertexnum;i++) //初始化邻接矩阵
for(j=0;j<G->vertexnum;j++)
G->arc[i][j]=0;
for(i=0;i<G->arcnum;i++)
{
int n,m,w;
cin1>>n>>m>>w; //修改邻接矩阵中的值
G->arc
[m]=w;
G->arc[m]
=w;
}
}
在此之前需要定义一个全局变量的visited数组:
int visited[maxvertex]; //标记已被访问过的顶点(全局变量)
//广度优先遍历
void BFS(MGraph *&G,int v)
{
queue<int> q;
int x,j;
if(!visited[v]) //即为visited[v]==0,也就是未被访问过
{
cout<<G->vertex[v]<<" ";
visited[v]=1;
q.push(v); //被访问的顶点入队
}
while(!q.empty()) //队不空进循环
{
x=q.front(); //取队头元素
q.pop(); //队头出队
for(j=0;j<G->vertexnum;j++)
if (G->arc[x][j]&&!visited[j])
{
cout<<G->vertex[j]<<" ";
visited[j]=1; //标记为访问过
q.push(j); //被访问的顶点继续入队
}
}
}
//深度优先遍历
void DFS(MGraph *&G,int v)
{
nt j;
if(!visited[v])
{
cout<<G->vertex[v]<<" ";
visited[v]=1; //标记为访问过
}
for(j=0;j<G->vertexnum;j++)
if (G->arc[v][j]&&!visited[j])//邻接矩阵的第(v,j)元素不为0
{ //且未被访问过则递归
DFS(G,j);
}
}
此为图的邻接矩阵的输出函数:
void Print(MGraph *G)
{
int i,j;
for(i=0;i<G->vertexnum;i++)
{
for(j=0;j<G->vertexnum;j++)
cout<<G->arc[i][j]<<" ";
cout<<endl;
}
}
main函数调用上面函数:
int main()
{
MGraph *G=new MGraph;
CreatMGraph(G);
cout<<"输出邻接矩阵:"<<endl;
Print(G);
cout<<"深度优先搜索:";
DFS(G,0);
cout<<endl;
memset(visited,0,sizeof(visited));//非常重要!!在下一个搜索之前一定要将标志位全部重新赋值为0
cout<<"广度优先搜索:";
BFS(G,0);
cout<<endl;
return 0;
}
相关文章推荐
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- 邻接矩阵深度优先和广度优先遍历(DFS和BFS)
- python遍历文件夹——深度优先(DFS)/广度优先(BFS)
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
- 邻接矩阵实现--图的深度优先遍历DFS和广度优先遍历BFS
- 数据结构-图-邻接矩阵深度和广度遍历DFS_BFS
- 图的遍历 DFS(深度优先),BFS(广度优先)
- 邻接矩阵深度和广度遍历DFS_BFS.c
- 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现
- 图的BFS遍历和DFS遍历(广度优先和深度优先)
- c语言编程 输出一个无向图的邻接表,邻接矩阵,进行深度和广度优先遍历
- 深度优先搜索遍历(DFS)——邻接矩阵存储
- C语言以邻接矩阵为存储结构的图的构造以及广度优先,深度优先遍历
- 【数据结构】邻接矩阵深度和广度遍历DFS_BFS
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
- 图的邻接矩阵存储 深度优先遍历 广度优先遍历 C语言实现
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
- DFS,BFS 深度优先遍历,广度优先遍历
- 广度优先遍历-BFS、深度优先遍历-DFS
- 树的存储结构和图的存储结构以及图的深度优先DFS搜索和BFS广度优先搜索