DFS实现步骤如下:
①访问顶点V,并标记V已经访问
②查找V的第一个邻接顶点w
③若W存在,则继续执行,否则算法结束
④若W未被访问,则使用DFS递归访问w
⑤查找V的下一个邻接节点,并记为W,转到步骤③
对上图进行DFS,则访问顺序为
A B D C E
使用伪代码如下:
Vector <int> G[maxn]
int vis[maxn]
void dfs(int u)
{
vis[u]=1; //设置为已经访问
int d=G[u].Size()//得到顶点u的所有邻接节点,个数为d
for(int i=0;i<d;i++)
{
int v=G[u][i];//扫描所有的邻接顶点,如果没访问过,则DFS访问这个顶点
if(!vis[v])
dfs(v);
}
}
附上全部代码:
#include<iostream>
using namespace std;
#define VertexSize 10
int visit[VertexSize];
typedef struct
{
int weight[VertexSize][VertexSize];
}Graph;
void Initiate_Graph(Graph *g,int n)
{
int i,j;
for(i=0;i<n;i++)
visit[i]=0;
for(j=0;j<n;j++)
{
if(i==j) g->weight[i][j]=0;
else g->weight[i][j]=0x7fff;
}
}
void InsertEdge(Graph *g,int v,int w,int weight,int n)
{
if(v<0 || v>=n||w<0||w>=n)
{
cout<<"overflow!"<<endl;
}
g->weight[v][w]=weight;
}
void dfs(Graph *g,int u,int n)
{
cout<<u<<" ";
visit[u]=1;
int i;
for(i=0;i<n;i++)
{
if(g->weight[u][i]>0 && g->weight[u][i]<0x7fff && !visit[i])
{
visit[i]=1;
dfs(g,i,n);
}
}
}
void main()
{
Graph g;
int n,edge;
cout<<"请输入图的顶点个数:"<<endl;
cin>>n;
cout<<"请输入图的边个数"<<endl;
cin>>edge;
Initiate_Graph(&g,n);
int i,p1,p2,weight;
cout<<"请输入顶点-顶点-权值:"<<endl;
for(i=0;i<edge;i++)
{
cin>>p1>>p2>>weight;
InsertEdge(&g,p1,p2,weight,n);
}
dfs(&g,0,n);
system("pause");
}