一、深度优先搜索遍历图
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
*/