图的遍历(深搜和广搜的思想)

一、深度优先搜索遍历图

1、图的存储:二维数组,i,j表示点,a[i][j]表示边长。

《图的遍历(深搜和广搜的思想)》

//图的dfs遍历
#include<bits/stdc++.h>
using namespace std;

const int INF=0x3ffffff;
int n,m,sum;
int a[101][101],vis[101];

void dfs(int st)
{
	int i;
	printf("%d ",st);
	sum++;
	if(sum==n) return ; //访问次数达到要求,结束。 
	
	for(i=1;i<=n;i++)
	{
		if(vis[i]==0&&a[st][i]==1) //访问未访问的节点 
		{
			vis[i]=1; //每次标记找过的节点 
			dfs(i); //递归查找。 
		}
	}
	return ;
}

int main(void)
{
	int i,j;
	int v,u;
	memset(vis,0,sizeof(vis));
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++) //初始化 
	{
		for(j=1;j<=n;j++)
		if(i==j) a[i][j]=0; 
		else a[i][j]=INF;
	}
	
	while(m--)
	{
		scanf("%d %d",&v,&u); //二维数组存储 
		a[v][u]=1;
		a[u][v]=1;
	}
	sum=1;
	vis[1]=1;
	dfs(1);
	return 0;
}

/*测试样例 
5 5
1 2
1 3
1 5
2 4
3 5


结果输出:
1 2 4 3 5 
*/ 

 

二、广度优先搜索的图的遍历

相当于二叉树的层序遍历,就是一一个点为中心,遍历他周围的节点。

《图的遍历(深搜和广搜的思想)》

 

//图的bfs遍历
#include<bits/stdc++.h>
using namespace std;

const int INF=0x3fffff;
int a[101][101],vis[101];  //二维数组存储结构和vis标记 
int q[101]; //相当于队列,存储数据。 

int main(void)
{
	int n,m,i,j;
	int u,v;
	memset(vis,0,sizeof(vis)); //初始化标记数组 
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++) //初始胡二维数组 
	{
		for(j=1;j<=n;j++)
		if(i==j) a[i][j]=0;
		else a[i][j]=INF;
	}
	
	while(m--)
	{
		scanf("%d %d",&u,&v); //输入无向图 
		a[v][u]=1;
		a[u][v]=1;
	}
	//初始胡队列 
	memset(q,0,sizeof(q));
	int head=1,tail=1,tp,sum=0;
	q[tail]=1;
	tail++;
	vis[1]=1;
	
	while(head<tail)
	{
		
		tp=q[head];
		for(i=1;i<=n;i++)  
		{
			if(vis[i]==0&&a[tp][i]==1)  //将未走过的节点进队。 
			{
				vis[i]=1;
				q[tail]=i;
				tail++;
			}
			if(tail>n) //结束条件。 
			break;
		}
		head++;
	}
	
	for(i=1;i<tail;i++)  //遍历输出 
	printf("%d ",q[i]);
	return 0;
}

/*
输入样例:
5 5
1 2
1 3
1 5
2 4
3 5

输出样例:
1 2 3 5 4
*/ 

 

三、例题

计算出城市地图的最短路径。

《图的遍历(深搜和广搜的思想)》

//城市地图(图的深度优先遍历) 
#include<bits/stdc++.h>
using namespace std;
int a[101][101],vis[101]; //二维数组,标记数组 
int mi,n,m; //最小值 
const int INF=0xffff;

void dfs(int tp,int dis)
{
	if(dis>mi) return ; //如果路径大于原路径就返回 
	if(tp==n)   //找到终点 
	{
		if(dis<mi) mi=dis;
		return ;
	}
	for(int i=1;i<=n;i++)
	{
		if(a[tp][i]!=INF&&vis[i]==0) //未标记过的路径 
		{
			vis[i]=1;
			dfs(i,dis+a[tp][i]);
			vis[i]=0;
		}
	}
	return ;
}

int main(void)
{
	int i,j;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++) //二维数组初始化 
	{
		for(j=1;j<=n;j++)
		if(i==j) a[i][j]=0;
		else a[i][j]=INF;
	}
	
	int u,v,w;
	while(m--)
	{
		scanf("%d %d %d",&u,&v,&w); 
		a[u][v]=w;
	}
	
	mi=INF;
	dfs(1,0);
	printf("%d\n",mi); //输出最短路径的结果。 
	return 0;
}

/*输入样例: 
5 8
1 2 2
1 5 10
2 3 3
2 5 7
3 1 4
3 4 4
4 5 5
5 3 3

输出样例:
9 
*/

 

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/qq_41829060/article/details/81429944
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞