图的遍历-代码实现

深度优先遍历-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 <iostream>
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<<v<<' ';
	for(int i=1;i<=n;i++) //访问当前节点的每个邻接节点
	  if(!visited[i]&&G[v][i]>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 <iostream>
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<<v<<' ';
	for(int i=head[v];i!=0;i=e[i].next) //访问当前节点的每条边 
	  if(!visited[e[i].to]) //判断边所对应的邻接点是否被访问 
	     dfs(e[i].to);    
}

void addEdge(int from,int to,int w){
	num++;
	e[num].next=head[from];
	e[num].to=to;
	e[num].w=w;
	head[from]=num;
}

int main(){
	int u,v,cost;

	cin>>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 <iostream>
#include <queue> 
using namespace std;
int const MAXN=1000;
int G[MAXN][MAXN];
int visited[MAXN];
int m,n;
queue<int > q;

void bfs(int v){
	visited[v]=true;
	cout<<v<<' ';
	q.push(v);
	while(!q.empty()){
	  int t=q.front();
	  q.pop();
	  for(int i=1;i<=n;i++) //访问t的每个邻接点
	     if(!visited[i]&& G[t][i]>0)
		 {
	       visited[i]=true;
		   cout<<i<<' ';
	       q.push(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;
	}
	bfs(1);
	return 0;
}

 

实现代码2-邻接表存储

#include <iostream>
#include <queue>
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 <int> q;
 
void bfs(int v){
	visited[v]=true;
	cout<<v<<' ';
	q.push(v);
	while(!q.empty()){
	  int t=q.front();
	  q.pop();
	  for(int i=head[t];i!=0;i=e[i].next) //访问t的每个邻接点
	     if(!visited[e[i].to])
		 {
	       visited[e[i].to]=true;
		   cout<<e[i].to<<' ';
	       q.push(e[i].to);
	     } 
	}
}

void addEdge(int from,int to,int w){
	num++;
	e[num].next=head[from];
	e[num].to=to;
	e[num].w=w;
	head[from]=num;
}

int main(){
	int u,v,cost;

	cin>>m>>n;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>cost;
	    addEdge(u,v,cost);
	}
	bfs(1);
	return 0;
}

 

猜你喜欢

转载自blog.csdn.net/Zerotogether/article/details/105144598