深度优先搜索:
#include<stdio.h>
int book[101],sum,n,e[101][101] ;
void dfs(int cur)
{
printf("%d ",cur) ;
sum++ ; //每访问一个顶点,sum就加一
if(sum==n)
return ;//所有的顶点都已经访问过则直接退出
for(int i=1;i<=n;i++)//从一号顶点到 n 号顶点一次尝试,
//看那些顶点与当前顶点cur有边相连
{
//判断当前顶点cur到顶点i是否有边,
//并判断顶点i是否已访问过
if(e[cur][i]==1&&book[i]==0)
{
book[i] = 1 ;
dfs(i) ;
}
}
return ;
}
int main()
{
int m,a,b ;
scanf("%d %d",&n,&m) ;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(i==j)
e[i][j] = 0 ;
else
e[i][j] = 99999999 ;//设99999999为正无穷
}
}
//读入顶点之间的边
for(int i=1;i<=m;i++)
{
scanf("%d %d",&a,&b) ;
e[a][b] = 1 ;
e[b][a] = 1 ;
}
//从1号顶点出发
book[1] = 1 ;//标记1号顶点已访问
dfs(1) ; //从一号顶点开始遍历
return 0 ;
}
广度优先搜索
#include<stdio.h>
int main()
{
int n,m,cur ;
int book[101] = {0} ;
int e[101][101] ;
int que[10001],head,tail ;
scanf("%d %d",&n,&m) ;
//初始化二维矩阵
for(int i=1;i<=n;i++)
{
for(int j=1;j<n;j++)
{
if(i==j)
e[i][j] = 0 ;
else
e[i][j] = 99999999 ; //设999999999为正无穷
}
}
int a ;
int b ;
//读入顶点之间的边
for(int i=1;i<=m;i++)
{
scanf("%d %d",&a,&b) ;
e[a][b] = 1 ;
e[b][a] = 1 ;//无向图
}
//队列初始化
head = 1 ;
tail = 1 ;
//从一号顶点出发,将一号顶点加入队列
que[tail] = 1 ;
tail++ ;
book[1] = 1 ; //标记1号顶点已访问
//当队列不为空的时候循环
while(head<tail&&tail<=n)
{
cur = que[head] ;//当前正在访问的顶点编号
for(int i=1;i<=n;i++)//从1-n一次尝试
{
//判断从顶点cur到顶点1是否有边,并判断顶点i是否已经访问过
if(e[cur][i]==1&&book[i]==0)
{
//如果顶点cur到顶点i有边,并且顶点i没有被访问过,则将顶点i入队
que[tail] = i ;
tail++ ;
book[i] = 1 ;
}
//如果tail大于 n ,则表明所有顶点都已经被访问过
if(tail>n)
break ;
}
head ++ ;//注意这个地方,千万不要忘记一个顶点扩展结束后,head++,然后
//才能继续往下扩展
}
for(int i=1;i<tail;i++)
printf("%d ",que[i]) ;
return 0 ;
}