深度优先搜索(DFS)介绍与总结
深度优先搜索(如果想学习BFS的话,我的博客中也有,欢迎学习和交流)
也就是DFS,要学习深度优先搜索,首先我们要知道,什么是深度优先遍历,从名字就可以看出,他是按深度遍历,也就是,直接到底,再回来再到底,重复;用图来说
1->2->4->8->9->5->10->3->6->7,这就是所说的,一路到底再走下一路到底,重复进行。
先从根走,标记1,再走向2,此时标记2,再走4,标记4,再走8,标记8,8走完之后,返回4,4已经被标记,所以,往右,到9,标记9,9完了之后返回4,再返回2,再到5,标记5,再走到10,标记10,右树同左;
代码实现
这是一个简单的框架,如果看不懂的话,可以看下面的例题。
#include<stdio.h>
bool mark[10]={false};//标记数列,首先将所有都设置未未使用过
int num[10]={1,2,3,4,5,6,7,8,9};
void DFS(int i)
{
if()//前面是if判断语句,可以一个可以多个,将不符合条件的数直接去掉返回
{
return;
}
if()//这个if判断语句,则是到达终点,符合条件的话,按题目输出或者保存,之后继续返回,继续下一次遍历
{
//题目要求语句;
return
}
for()//这时候循环,按层数,
{
if(mark[])//判断如果某个数未被使用过,也就是那条路没被走过,走一下
{
//将数带入数列
DFS(i+1);//dfs下个节点
mark[]=false;//走过之后,清零,还原;
}
}
}
#include "StdAfx.h"//VS2010语句,若使用VC则可以删除;
#include<stdio.h>
const int maxn=25;
double w[maxn];
double c[maxn];
bool mark[maxn]={false};//标记数列,首先将所有都设置未未使用过
int n;//要在DFS中用到,一定是全局变量(全局变量在所有函数之外,包括主函数)
int sumC=0;//总价值
int maxValue=0;//最大价值
int V=0;//书包容量
int sumW=0;//总重量
void DFS(int i)
{
if(sumW>V)//截止条件,也就是题中的超过背包容量V;
return;
if(sumC>maxValue)//大于最大价值,就改变
{
maxValue=sumC;
}
for(int i=0;i<n;i++)//这里是进行循环,回溯的关键,将每个点都轮回;
{
if(!mark[i])//如果某个物品未被放入过,将其放入
{
mark[i]=true;//物品被放入;
sumC+=c[i];//更改总价值;
sumW+=w[i];//更改总重
DFS(i+1);//继续往下;
mark[i]=false;//物品加入尝试完成,将物品取出;
}
}
}
int main()
{
scanf("%d",&n);
scanf("%d",&V);
for(int i=0;i<n;i++)
scanf("%d%d",&w[i],&c[maxn]);
DFS(0);
printf("%d",maxValue);
}
如果我有什么问题的话,请大佬们指出谢谢。