问题分析:
考察点:深度优先、图
DFS:首先访问出发顶点v; 选择一个与v相邻接且未被访问过的顶点w访问之,再从w开始进 行深度优先搜索; 每当到达一个其所有相邻接的顶点都已被访问过的顶点,就从 最后所访问的顶点开始,依次退回到尚有邻接顶点未曾访问过 的顶点u,并从u开始进行深度优先搜
代码解决部分:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1001;
bool visit[MAXN];//存储顶点i是否访问过
bool path[MAXN][MAXN];//存储i到j的边,邻接表存储
int n,m,start;
int num=0;
void dfs(int u)
{
visit[u]=true;
num++;
printf("%d ",u);
for(int i=1;i<=n;i++)
{
if(path[u][i]&&!visit[i])
{
dfs(i);
printf("%d ",u);//回路输出
}
}
}
int main()
{
cin>>n>>m>>start;
int x,y;
for(int i=1;i<=m;i++)
{
cin>>x>>y;
path[x][y]=path[y][x]=true;//x到y有无向边
}
for(int i=1;i<=n;i++)
{
visit[i]=false;
}
dfs(start);
if(num!=n)
{
printf("0");
}
system("pause");
return 0;
}
解释:n个顶点和m条边,因为DFS对邻接表中的每个结点(链表中的结 点)至多检查一次,共有2m个结点,所以执行时间为O(n+m)。