DFS_BFS

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;
	} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值