基于邻接矩阵的图搜索

#include <iostream>
#include<iomanip>
#include <string>
#include<queue>
using namespace std;
//图的邻接矩阵存储表示
#define MAX_VERTEX_NUM 50
typedef enum { DG, DN, UDG, UDN } GraphKind; //{有向图,有向网,无向图,无向网}
typedef enum { OK, ERROR } Status;
typedef struct ArcCell{
int adj; //顶点关系类型。对于无权图,用0或1表示相邻否。对于有权图,则为权值类型。
string info; //该弧所携带的信息
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
int vexs[MAX_VERTEX_NUM]; //顶点向量
AdjMatrix arcs; //邻接矩阵
int vexnum, arcnum; //图的当前顶点数和弧数
GraphKind kind; //图的种类标志
}MGraph;
bool visited[MAX_VERTEX_NUM]; //设访问标志数组,供遍历时使用
void  DFS(MGraph G, int v);
void VisitFunc(int v);
int FirstAdjVex(MGraph G, int v);
int NextAdjVex(MGraph G, int v, int w);
void CreateUDGTest(MGraph &G)
{ //构造一个测试用的无向图
int i, j;
//数组a[5][2]包含所有边
int a[6][2] = { { 0, 1 }, { 0, 3 }, { 1, 2 }, { 1, 4 }, { 2, 3 }, {2, 4 } };
G.kind = UDG;
G.vexnum = 5;
G.arcnum = 6;
for (i = 0; i<G.vexnum; ++i) //构造顶点向量
G.vexs[i] = i;
for (i = 0; i<G.vexnum; ++i) //初始化为全0
for (j = 0; j<G.vexnum; ++j)
G.arcs[i][j].adj = 0;
for (i = 0; i<G.arcnum; ++i) //对存在的边赋值1
G.arcs[a[i][0]][a[i][1]].adj = G.arcs[a[i][1]][a[i][0]].adj = 1;
}

void DFSTraverse(MGraph G)
{ //对图G作深度优先遍历
int v;
for (v = 0; v<G.vexnum; ++v) //访问标志数组初始化
visited[v] = false;
for (v = 0; v<G.vexnum; ++v)
if (!visited[v]) //对未访问的顶点调用DFS
DFS(G, v);
}
void DFS(MGraph G, int v)
{ //从第v个顶点出发,递归地深度优先遍历图G
int w;
visited[v] = true;
VisitFunc(v); //访问第v个顶点
for (w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w))
if (!visited[w])
DFS(G, w); //对v的尚未访问的邻接顶点w递归调用DFS
}
void BFSTraverse(MGraph G)
{
//按广度优先非递归地遍历图G。使用辅助队列Q和访问标志数组visited
int v, w;
queue<int>q;
for (v = 0; v<G.vexnum; ++v) //访问标志数组初始化
visited[v] = false;
for (v = 0; v<G.vexnum; ++v)
if (!visited[v])
{
visited[v] = true;
VisitFunc(v);
q.push(v);
while (!q.empty()){
q.pop();//对头元素出队,并置为u
for (w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w))
if (!visited[w])
{ //w为u未访问的邻接顶点
visited[w] = true;
VisitFunc(w);
q.push(w);
}
}
}//if
}//BFSTraverse
void VisitFunc(int v)
{ //访问第v个节点
cout << "V"<<v << " , ";
}
int FirstAdjVex(MGraph G, int v)
{ //返回节点v的第一个邻接顶点
int i;
for (i = 0; i<G.vexnum; ++i)
if (G.arcs[v][i].adj != 0 && i != v)
return i;
return -1; //如果没有,返回-1
}
int NextAdjVex(MGraph G, int v, int w)
{
//返回节点v的邻接顶点中w之后的下一个邻接顶点
int i;
for (i = w + 1; i<G.vexnum; ++i)
if (G.arcs[v][i].adj != 0 && i != v)
return i;
return -1; //如果没有,返回-1
}

int main()
{
MGraph gra;
cout << endl;
CreateUDGTest(gra); //构造无向图G
cout << "  对无向图G作深度优先遍历:";
DFSTraverse(gra);
cout<< endl; //对无向图G作深度优先遍历
cout << "  对无向图G作广度优先遍历:" ;
BFSTraverse(gra);
cout << endl;
cout << endl;
system("pause");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值