深度优先搜索(DFS)介绍与总结

5 篇文章 0 订阅
4 篇文章 0 订阅

深度优先搜索(如果想学习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);
}

如果我有什么问题的话,请大佬们指出谢谢。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值