DFS_BFS
参考:搜索总结)(深搜和广搜)
Java数据结构和算法(十五)——无权无向图
样例
BFS原理:
队尾【A】队头 ------------队头赋值t且出队,遍历矩阵arcs[t][i],判断是否相连且没有被输出,若为true,输出visited[t] = false;
【E,D,C,B】 ----------------此时,A出队且输出,与A相连的节点入队,重复以上步骤
【F,E,D,C】
【F,E,D】
【G,F,E】
【G,F】
【H,G】
【I,H】
【I】
【】所有节点输出
DFS原理:
【A】栈顶------------------栈顶输出赋值t不出栈,遍历矩阵arcs[t][i],判断是否相连且没有被输出,若为true,压栈、退出遍历矩阵、输出但不出栈,若为false,说明该节点为最深处,出栈,重复以上步骤。
【A,B】
【A,B,F】
【A,B,F,H】此时为false,
【A,B,F】
【A,B】
【A】
【A,C】
【A】
…
【A,D,G,I】
【A,D,G】
【A,D】
【A】
【A,E】
【A】
【】
输入
9 8
1 2 1
1 3 1
1 4 1
1 5 1
2 6 1
6 8 1
4 7 1
7 9 1
#include<iostream>
#include<queue>
#include<stack>
#define MAX_VERTS 50
using namespace std;
struct Graph{
int numN;//顶点个数
int numE;//边数
int vertexList[MAX_VERTS];
int arcs[MAX_VERTS][MAX_VERTS];
// bool bunded[MAX_VERTS][MAX_VERTS];
};
void BFS(Graph *G, bool *visited){
int i, j;
if(G->numN==0){
return ;
}
queue<int> q;
for(i = 1; i <= G->numN; i++){
if(!visited[i]){
q.push(G->vertexList[i]);
visited[i] = true;
while(!q.empty()){
int t = q.front();
cout << t;
q.pop();
for(j = 1; j <= G->numN;j++){
if(visited[j]==false&&G->arcs[t][j]!=0){
q.push(G->vertexList[j]);
visited[j] = true;
}
}
// t = q.front()
}
}
}
}
void DFS(Graph *G, bool *visited){
if(G->numN==0){
return ;
}
stack<int> s;
int i, j;
s.push(G->vertexList[1]);
cout << s.top();
visited[1] = true;
while(!s.empty()){
int t = s.top(), Count = 1;
while(Count <= G->numN){
if(G->arcs[t][Count]!=0&&visited[Count]!=true){
break;
}
Count++;
}
if(Count > G->numN){
s.pop();
}else{
s.push(G->vertexList[Count]);
cout << s.top();
visited[Count] = true;
}
}
}
void DFS_hg(Graph *G, bool *visited, int v){
int i;
visited[v] = true;
cout << G->vertexList[v];
for(i = 1; i <= G->numN; i++){
if(G->arcs[v][i]!=0&&visited[i]==false){
DFS_hg(G,visited,i);
}
}
}
void initialzeGraph(Graph *G, bool *visited){
int i, j;
for(i = 0; i < MAX_VERTS; i++){
visited[i] = false;
for(j = 0; j < MAX_VERTS; j++){
G->arcs[i][j] = 0;
}
}
}
void initialzeVisited(bool *visited){
int i;
for(i = 0; i < MAX_VERTS; i++){
visited[i] = false;
}
}
void createGraph(Graph *G, bool *visited){
int i, a, b, q;
for(i = 1; i <= G->numE; i++){
cin >> a >> b >> q;
G->arcs[a][b] = q;
G->arcs[b][a] = q;
}
for(i = 1; i <= G->numN; i++){
G->vertexList[i] = i;
}
}
int main(){
static Graph G;
static bool visited[MAX_VERTS];
int i, n, j;
cin >> G.numN >> G.numE;
initialzeGraph(&G,visited);//初始化G图
createGraph(&G,visited);//建G图
BFS(&G,visited);//广搜
cout << endl;
initialzeVisited(visited);//初始化visited
DFS(&G,visited);//深搜非递归
initialzeVisited(visited);
cout << endl;
DFS_hg(&G,visited,1); //深搜递归
return 0;
}