首先访问图中首位起始顶点v,然后由v出发,访问与v邻接且未被访问的任意一个顶点w1,再访问与w1邻接且未被访问的任意一个顶点w2......重复上述过程。当不能再继续往下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直至图中所有顶点均被访问过为止。
算法过程如下
bool visited[MAX_VEXTEX_NUM];
void DFSTraverse(Graph G)
{
for(v=0;v<G.vexnum;v++){
visited[v]=false;
}
for(v=0;v<G.vexnum;v++){
if(visited[v])
DFS(G,v);
}
}
void DFS(Graph G,int v)
{
visit(v);
visited[v]=true;
for(w=FristNeighbor(G,v);w>=0;w=NextNeightbor(G,v,w))
{
if(!visited[w])
DFS(G,w);
}
}
举例
给定一个n个数字的序列(均为整数),求k个数字的和为sum的情况有多少种?
#include <iostream>
using namespace std;
void dfs(int i,int cunt,int s);
int n,k,sum,a[100];
/*i只当前选到第几个数,cnt只选取了几个数,s指当前所选数字之和*/
int i,cnt,ans,s;
int main()
{
int i;
cin>>n>>k>>sum;
for(i=0;i<n;i++)
{
cin>>a[i];
}
ans=0;
dfs(0,0,0);
cout<<ans<<endl;
return 0;
}
void dfs(int i,int cnt,int s)
{
if(i==n)
{
if(cnt==k&&s==sum)
{
ans++;
}
return;
}
//不选取或选取第i个数
dfs(i+1,cnt,s);
dfs(i+1,cnt+1,s+a[i]);
}
黑皇后白皇后问题
#include <iostream>
#include <math.h>
#include <cstring>
#include <algorithm>
using namespace std;
/*n皇后问题*/
int vy[100],v1[100],v2[100];
int mp[100][100];
int ans=0,n;
void dfs(int x,int p)
{
if(x==n&&p==2)
{
ans++;
return;
}
if(x==n&&p==1)
{
dfs(0,p+1);
}
for(int i=0;i<n;i++)
{
if(mp[x][i]!=0&&vy[i]!=p&&vy[i]!=3&&v1[x+i]!=p&&v1[x+i]!=3&&v2[x-i+n]!=p&&v2[x-i+n]!=3)
{
mp[x][i]=0;
vy[i]+=p;
v1[x+i]+=p;
v2[x-i+n]+=p;
dfs(x+1,p);//下一行
mp[x][i]=1;
vy[i]-=p;
v1[x+i]-=p;
v2[x-i+n]-=p;
}
}
}
int main()
{
cin>>n;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>mp[i][j];
}
}
dfs(0,1);
cout<<ans<<endl;
}
炸弹问题
#include <iostream>
#include <math.h>
#include <cstring>
#include <algorithm>
using namespace std;
/*炸弹问题*/
int vx[100],vy[100];
int mp[100][100];
int ans=0,n,m;
void dfs(int x,int y)
{
mp[x][y]=0;
if(!vx[x])
{//当前行没有被引爆
vx[x]=true;
for(int i=0;i<m;i++)
{
if(mp[x][i]==1)
dfs(x,i);
}
}
if(!vy[y])
{//当前列没有被引爆
vy[y]=true;
for(int i=0;i<n;i++)
{
if(mp[i][y]==1)
dfs(i,y);
}
}
}
int main()
{
cin>>n>>m;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>mp[i][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mp[i][j]==1)
{
ans++;
dfs(i,j);
}
}
}
cout<<ans<<endl;
}