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

一、深度优先搜索遍历图

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

图的遍历(深搜和广搜的思想)_第1张图片

//图的dfs遍历
#include
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 
*/ 

 

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

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

图的遍历(深搜和广搜的思想)_第2张图片

 

//图的bfs遍历
#include
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(headn) //结束条件。 
			break;
		}
		head++;
	}
	
	for(i=1;i

 

三、例题

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

图的遍历(深搜和广搜的思想)_第3张图片

//城市地图(图的深度优先遍历) 
#include
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

 

你可能感兴趣的:(啊哈!算法)