图的遍历-代码实现

深度优先遍历-DFS

深度优先遍历与深搜DFS相似,从一个点A出发,将这个点标为已访问visited[i]=true;,然后再访问所有与之相连,且未被访问过的点。当A的所有邻接点都被访问过后,再退回到A的上一个点(假设是B),再从B的另一个未被访问的邻接点出发,继续遍历。

算法框架:

void DFS ( Vertex V ){ 
visited[ V ] = true;
for ( V 的每个邻接点 W )
     if ( !visited[ W ] )
       DFS( W );
}

 

代码实现1-邻接矩阵存储

#include 
using namespace std;
int const MAXN=1000;
int G[MAXN][MAXN];
int visited[MAXN];
int m,n;
void dfs(int v){
	visited[v]=true;
	cout<0)  
	  dfs(i);    
}
int main(){
	int u,v,cost;
	
	cin>>m>>n;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>cost;
		G[u][v]=cost;
	}
	dfs(1);
	return 0;
}

代码实现2-邻接表存储

#include 
using namespace std;
struct Edge{
	int to;
	int next;
	int w; //边的权值 
};
int const MAXN=1000;
int visited[MAXN];
int m,n;
Edge e[MAXN*2];
int head[MAXN];
int num=0;

void dfs(int v){
	visited[v]=true;
	cout<>m>>n;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>cost;
	    addEdge(u,v,cost);
	}
	dfs(1);
	return 0;
}

 

宽度优先搜索-BFS

BFS依靠队列实现,对节点层层扩展,具体过程可查看视频:https://www.bilibili.com/video/BV1oE41147rW

 

实现代码1-邻接矩阵存储

#include 
#include  
using namespace std;
int const MAXN=1000;
int G[MAXN][MAXN];
int visited[MAXN];
int m,n;
queue q;

void bfs(int v){
	visited[v]=true;
	cout<0)
		 {
	       visited[i]=true;
		   cout<>m>>n;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>cost;
		G[u][v]=cost;
	}
	bfs(1);
	return 0;
}

 

实现代码2-邻接表存储

#include 
#include 
using namespace std;
struct Edge{
	int to;
	int next;
	int w; //边的权值 
};
int const MAXN=1000;
int visited[MAXN];
int m,n;
Edge e[MAXN*2];
int head[MAXN];
int num=0;
queue  q;
 
void bfs(int v){
	visited[v]=true;
	cout<>m>>n;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>cost;
	    addEdge(u,v,cost);
	}
	bfs(1);
	return 0;
}

 

 

你可能感兴趣的:(图-基础)