1.DFS (Depth First Search) 深度优先搜索
其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次
//表结点
struct ArcNode {
int adfvex;//表示该边的另外一个顶点在顶点表中的下标
ArcNode * next; //表示依附在该顶点的下一条边的信息
};
//头结点
struct Vnode {
string data; //记录基本信息i
ArcNode * firstarc;//记录第一条依附在该顶点的边
};
//一个图的结构
struct Graph_List {
int vexnum; //图的顶点数
int edge; //图的边数
Vnode * node; //邻接表
};
//DFS遍历图
void DFS_store_list(Graph_List g, int v, bool * & visit) {
cout << g.node[v].data << " ";
visit[v] = true;
ArcNode * next = g.node[v].firstarc;
while (next) {
if (!visit[next->adfvex]) {
DFS_store_list(g, next->adfvex, visit);//递归
}
else {
next = next->next;
}
}
}
void DFS_list(Graph_List g, int begin) {
int i;
bool * visit = new bool[g.vexnum];
for (i = 0; i < g.vexnum; i++) {
visit[i] = false;
}
DFS_store_list(g, 0, visit);
for (i = 1; i < g.vexnum; i++) {
if(!visit[i])
DFS_store_list(g, i, visit);
}
}
2.BFS (Breadth First Search) 广度优先搜索
1任意点v出发=>访问v ->访问v的邻接点
2.v的邻接点出发 ->访问v的邻接点的邻接点
“先被访问的顶点的邻接点”先于”后被访问的邻接点”访问,直至图中所有的顶点都被访问到为止
//表结点
struct ArcNode {
int adfvex;//表示该边的另外一个顶点在顶点表中的下标
ArcNode * next; //表示依附在该顶点的下一条边的信息
};
//头结点
struct Vnode {
string data; //记录基本信息i
ArcNode * firstarc;//记录第一条依附在该顶点的边
};
//一个图的结构
struct Graph_List {
int vexnum; //图的顶点数
int edge; //图的边数
Vnode * node; //邻接表
};
//BFS遍历图
void BFS_list(Graph_List g, int begin) {
int i;
bool * visit = new bool[g.vexnum];
for (i = 0; i < g.vexnum; i++) {
visit[i] = false;
}
queue<int> q;
for (int v = 0; v < g.vexnum; v++) {
if (!visit[(begin + v) % g.vexnum])
{
cout << g.node[(begin - 1 + v) % g.vexnum].data << " ";
visit[(begin + v) % g.vexnum] = true;
q.push((begin + v) % g.vexnum);//初始化队列
while (!q.empty())
{
int u = q.front();
q.pop();
ArcNode * next;
next = g.node[u].firstarc;//获得依附在该顶点的第一条边的信息
while (next) {//遍历该链表上的所有的点
if (!visit[next->adfvex]) {
cout << g.node[next->adfvex].data << " ";
visit[next->adfvex] = true;
q.push(next->adfvex);
}
next = next->next;
}
}
}
}
}