//图的深度优先遍历
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_VERTEX_NUM 30
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef char VertexType[10];
typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
struct Graph
{
VertexType vexs[MAX_VERTEX_NUM]; // 顶点向量
AdjMatrix arcs; // 邻接矩阵
int vexnum,arcnum; // 图的当前顶点数和弧数
};
int LocateVex(Graph G,VertexType u)
{
// 初始条件:图G存在,u和G中顶点有相同特征
// 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1
int i;
for(i=0; i<G.vexnum; ++i)
if(strcmp(u,G.vexs[i])==0)
return i;
return -1;
}
int FirstAdjVex(Graph G,int v)
{
// 初始条件: 图G存在,v是G中某个顶点
// 操作结果: 返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1
int i,j=0,k;
//k=LocateVex(G,v); // k为顶点v在图G中的序号
for(i=0; i<G.vexnum; i++)
if(G.arcs[v][i]!=j) //无向图
return i;
return -1;
}
int NextAdjVex(Graph G,int v,int w)
{
// 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点
// 操作结果: 返回v的(相对于w的)下一个邻接顶点的序号,
// 若w是v的最后一个邻接顶点,则返回-1
int i,j=0,k1,k2;
//k1=LocateVex(G,v); // k1为顶点v在图G中的序号
//k2=LocateVex(G,w); // k2为顶点w在图G中的序号
for(i=w+1; i<G.vexnum; i++)
if(G.arcs[v][i]!=j)
return i;
return -1;
}
Status CreateAG(Graph &G)
{
// 采用数组(邻接矩阵)表示法,由文件构造没有相关信息的无向图G
int i,j;
scanf("%d",&G.vexnum);//输入顶点的个数
//getchar();
for(i=0; i<G.vexnum; ++i) // 构造顶点向量
scanf(" %s",G.vexs[i]);
for(i=0; i<G.vexnum; ++i) // 初始化邻接矩阵
for(j=0; j<G.vexnum; ++j)
scanf("%d",&G.arcs[i][j]);
return OK;
}
void visitFuc(Graph G,int v)
{
printf("%s ",G.vexs[v]);
}
void DFS(Graph G,int v,int visited[])
{
int w;
visitFuc(G,v);
visited[v]=TRUE;
for(w=FirstAdjVex(G,v); w>=0; w=NextAdjVex(G,v,w))
{
if(!visited[w])
DFS(G,w,visited);//递归调用
}
}
void DFSTraverse(Graph G)
{
int visited[30];
int v;
for(v=0; v<G.vexnum; v++)
{
visited[v]=FALSE;//初始化
}
for(v=0; v<G.vexnum; v++)
{
if(!visited[v])
{
DFS(G,v,visited);
}
}
}
int main()
{
Graph G;
CreateAG(G);
DFSTraverse(G);
return 0;
}
无向图的深度优先遍历
最新推荐文章于 2024-02-13 21:00:17 发布