#include<iostream>
using namespace std;
const int MAX=20;
//定义一个图
struct Graph
{
int vertex[MAX];//顶点数组
int relate[MAX][MAX];//顶点邻接矩阵
int vnum;//顶点个数
};
//创建一个图
void CreatGraph(Graph *g,int n)
{
int i,j,v;
g->vnum=n;
// 创建n个顶点
for(i=1;i<=n;i++)
g->vertex[i]=i;
//建立邻接矩阵
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<“顶点“<<i<<“和顶点“<<j<<“的关系(1有0无):”;
cin>>v;
g->relate[i][j]=v;
g->relate[j][i]=v;
}
}
}
//打印出邻接矩阵
void PrintRelate(Graph *g)
{
int i,j;
for(i=1;i<=g->vnum;i++)
{
for(j=1;j<=g->vnum;j++)
{
cout<<g->relate[i][j]<<” “;
}
cout<<endl;
}
}
//全局变量——访问标志数组
int visited[MAX];
//访问顶点
void Visitvex(Graph *g,int vex)
{
cout<<g->vertex[vex];
}
//深度优先遍历算法开始
//获取第一个未被访问的邻接节点
int FirstAdjVex(Graph *g,int vex)
{
int w,i;
for(i=1;i<=g->vnum;i++)
{
if(g->relate[vex][i]==1&&visited[i]==0)
{
w=i;break;
}
else
w=0;
}
return w;
}
//获取下一个未被访问的邻接节点
int NextAdjVex(Graph *g,int vex,int w)
{
int i;
for(i=w;i<=g->vnum;i++) //从w开始
{
if(g->relate[vex][i]==1&&visited[i]==0)
{
w=i;
break;
}
else
w=0;
}
return w;
}
//深度递归遍历
void DFS(Graph *g,int vex)
{
int w;
visited[vex]=1;
cout<<vex<<“,”;//打印正在访问节点的信息
w=FirstAdjVex(g,vex);//访问vex的第一个孩子节点
while(w>0)
{
DFS(g,w);
w=NextAdjVex(g,vex,w);//查看w是否有兄弟节点
}
}
void DFSTraver(Graph *g)
{
int i,w;
for(i=1;i<=g->vnum;i++)
visited[i]=0; //访问标志数组
for(i=1;i<=g->vnum;i++)
{
if(visited[i]==0)
DFS(g,i);
}
}
//main
int main()
{
Graph g;
int n;
cout<<“创建一个图,输入顶点数:“;
cin>>n;
CreatGraph(&g,n);
PrintRelate(&g);
DFSTraver(&g);
return 0;
}
图的深度遍历算法
原文作者:数据结构之图
原文地址: https://blog.csdn.net/liuxing8807/article/details/6049887
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/liuxing8807/article/details/6049887
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。