深度优先搜索

基于深度优先搜索的两顶点路径存在与否的判断

一个人想着一个人 提交于 2019-12-05 12:05:06
#include<iostream> #include<string> #include<cstring> using namespace std; #define MaxSize 100 using namespace std; typedef struct ArcNode { int adjvex; //该边所指向的结点的位置(也就是编号) struct ArcNode *nextarc; //指向下一条边的指针 int info; // }ArcNode; typedef struct { char data; //顶点信息 ArcNode *firstarc; //指向第一条边的指针 }VNode; typedef struct { VNode adjlist[MaxSize]; int n, e; //顶点数、边数 }AGraph; //图的邻接表类型 int visit[MaxSize]; int Locate(AGraph *AG, char c) { for (int i = 0; i < AG->n; i++) { if (AG->adjlist[i].data == c) return i; } } void DFS(AGraph *G, int v) { ArcNode *p; visit[v] = 1; //置标志位1代表已访问 p = G->adjlist

C/C++深度优先搜索(递归树模拟)

只愿长相守 提交于 2019-12-05 04:50:51
1 //C++深度优先搜索(递归树模拟) 2 #define _CRT_SECURE_NO_WARNINGS 3 #include <iostream> 4 #define MAX_N 1000 5 using namespace std; 6 int a[MAX_N]; 7 int n,k; 8 9 //已经从前i项得到了和sum,然后对于i项之后的进行分支 10 bool dfs(int i,int sum) 11 { 12 //如果前n项都计算过了 ,则返回sum是否与k相等 13 if(i==n) 14 { 15 return sum==k; 16 } 17 18 //不加上a[i]的情况的分支 19 if(dfs(i+1,sum)) 20 { 21 return true; 22 } 23 //加上a[i]的情况的分支 24 //if(dfs(i+1,sum+a[i+1])) 25 if(dfs(i+1,sum+a[i])) 26 { 27 return true; 28 } 29 30 //无论是否加上a[i]都不能凑成k就返回false 31 return false; 32 } 33 void solve() 34 { 35 //if(dfs(1,0)) 36 if(dfs(0,0)) 37 { 38 cout<<"Yes"<<endl; 39 } 40 else

深度优先搜索遍历连通图的递归算法

别说谁变了你拦得住时间么 提交于 2019-12-04 18:32:45
//深度优先搜索遍历连通图的递归算法 #include <iostream> using namespace std; #define MVNun 100 typedef char VerTexType; typedef int ArcType; typedef struct { VerTexType vexs[MVNun]; ArcType arcs[MVNun][MVNun]; int vexnum, arcnum; }Graph; bool visited[MVNun]; int FirstAdjVex(Graph G, int v); int NextAdjVex(Graph G, int v, int w); int LocateVex(Graph G, VerTexType v) { for (int i = 0;i < G.vexnum;++i) { if (G.vexs[i] == v) return i; } return -1; } void CreateUDN(Graph& G) { int i, j, k; cout << "请输入总顶点数,总边数 , 以空格隔开:"; cin >> G.vexnum >> G.arcnum; cout << endl; cout << "输入点的名称,如 a:" << endl; for (i = 0;i < G

深度优先搜索遍历非连通图

倖福魔咒の 提交于 2019-12-04 18:32:34
//深度优先搜索遍历非连通图 #include <iostream> using namespace std; #define MVNum 100 typedef char VerTexType; typedef int ArcType; typedef struct { VerTexType vexs[MVNum]; ArcType arcs[MVNum][MVNum]; int vexnum, arcnum; }Graph; bool visited[MVNum]; int FirstAdjVex(Graph G, int v); int NextAdjVex(Graph G, int v, int w); int LocateVex(Graph G, VerTexType v) { for (int i = 0;i < G.vexnum;++i) { if (G.vexs[i] == v) return i; } return -1; } void CreateUDN(Graph &G) { int i, j, k; cout << "请输入总顶点数,总边数,以空格隔开:"; cin >> G.vexnum >> G.arcnum; cout << endl; cout << "输入点的名称,如a" << endl; for (i = 0;i < G.vexnum;++i)

【待更新】深度优先搜索和广度优先搜索算法的应用

北城以北 提交于 2019-12-04 15:43:17
深度优先搜索 1.定义 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。 2.应用 例题1 有n件物品,每件物品的重量为w[i],价值为c[i]。现在需要选出若干件物品放入一个容量为V的背包中,使得在选入背包的物品重量和不超过容量V的前提下,让背包中物品的价值之和最大,求最大价值。(1≤n≤20) 如果使用DFS算法思想来解决这道题,就需要考虑到每一个物品都可以看作一个结点,而这道题可以构成一个特殊的数(从根节点开始,每一层只有一个结点),通过递归深度遍历每一个结点,然后穷尽所有可能的排列,最后更新某一个特征值。 C++语言实现: #include<iostream> using namespace std; #define maxn 30 int n,v; int maxvalue

LeetCode 5192. 查找集群内的「关键连接」

匿名 (未验证) 提交于 2019-12-03 00:06:01
1. 问题 力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号。 它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集群,其中连接 connections 是无向的。 从形式上讲, connections[i] = [a, b] 表示服务器 a 和 b 之间形成连接。任何服务器都可以直接或者间接地通过网络到达任何其他服务器。 「关键连接」是在该集群中的重要连接,也就是说,假如我们将它移除,便会导致某些服务器无法访问其他服务器。 请你以任意顺序返回该集群内的所有 「关键连接」。 示例 1: 输入:n = 4, connections = [[0,1],[1,2],[2,0],[1,3]] 输出:[[1,3]] 解释:[[3,1]] 也是正确的。 原题链接 ; 2. Tarjan算法 Tarjan 算法是在一个图中查找强连通分量的算法。强连通分量是指,每个顶点皆可由该图上的边抵达其他的每一个点的有向图。 算法的基本思想: 任选一个节点开始进行深度优先搜索(若深度优先搜索结束后仍有未访问的节点,则从中任选一点再次进行)。搜索过程中已访问的节点不再访问。 强连通分量的根: 指深度优先搜索是强连通分量重首个被访问的节点。 为找到根节点,我们给每个节点 v 一个深度优先搜索标号 v.index ,表示第几个被访问的节点。此外,每个节点有一个值 v

DFS(深度优先搜索)

匿名 (未验证) 提交于 2019-12-03 00:03:02
求有向图中的最短路径(JAVA+DFS算法实现) 问题描述 给定一个有向图,如下图所示,求从1号顶点到5号顶点的最短路径。 输入数据格式为第一行输入顶点数和边数,从第二行开始每一行输入3个整数,分别代表连接顶点的边和权重。 例如:1 2 2,表示从1号顶点到2号顶点连接的边,权重为2。 Input: 5 8 1 2 2 1 5 10 2 3 3 2 5 7 3 1 4 3 4 4 4 5 5 5 3 3 Output: 9 算法实现 package test2; import java.util.Scanner; public class dfstest { static int[][] edges=new int[100][100]; static int[] vertes=new int[100]; static int n,m,min=Integer.MAX_VALUE; static Scanner scanner=new Scanner(System.in); public static void main(String[] args) { // TODO Auto-generated method stub n=scanner.nextInt(); m=scanner.nextInt(); for (int i = 1; i <= n; i++) {//n个顶点 for

python实现深度优先搜索和广度优先搜索

匿名 (未验证) 提交于 2019-12-02 22:11:45
# 深度优先搜索 def dfs(g, s, v): # 递归结束条件 if s in v: return v v.append(s) for i in range(len(g)): if i not in v and g[s][i]: v = dfs(g, i, v) return v # 广度优先搜索 def bfs(g, s): v = [] q = [] q.append(s) while q: s = q[0] q.remove(s) for i in range(len(g)): if i not in v and i not in q and g[s][i]: q.append(i) v.append(s) return v # 手动输入点和边数据 # # 定义输入匿名函数 # def f(): return map(int, input().split()) # # 输入点数和边数 # n, m = f() # # 初始化二维列表作为图邻阶矩阵 # g = [[0] * n for i in range(n)] # # 输入边集合 # for k in range(m): # i, j = f() # g[i][j] = 1 # g[j][i] = 1 # 手动输入的测试用例: # 8 10 # 0 1 # 0 4 # 1 5 # 2 3 # 2 5 # 2 6 #

深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

匿名 (未验证) 提交于 2019-12-02 21:35:18
1、基础部分   在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达。现在有一份全国高铁模拟图,要从某个城市(顶点)开始,沿着铁轨(边)移动到其他城市(顶点),有两种方法可以用来搜索图:深度优先搜索(DFS)和广度优先搜索(BFS)。它们最终都会到达所有连通的顶点,深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现,不同的实现机制导致不同的搜索方式。 1.1 深度优先搜索   深度优先搜索算法有如下规则:    规则1: 如果可能,访问一个邻接的未访问顶点,标记它,并将它放入栈中。    规则2: 当不能执行规则 1 时,如果栈不为空,就从栈中弹出一个顶点。    规则3: 如果不能执行规则 1 和规则 2 时,就完成了整个搜索过程。   对于上图,应用深度优先搜索如下:假设选取 A 顶点为起始点,并且按照字母优先顺序进行访问,那么应用规则 1 ,接下来访问顶点 B,然后标记它,并将它放入栈中;再次应用规则 1,接下来访问顶点 F,再次应用规则 1,访问顶点 H。我们这时候发现,没有 H 顶点的邻接点了,这时候应用规则 2,从栈中弹出 H,这时候回到了顶点 F,但是我们发现 F 也除了 H 也没有与之邻接且未访问的顶点了,那么再弹出 F,这时候回到顶点 B,同理规则 1 应用不了,应用规则

[算法总结]DFS(深度优先搜索)

我怕爱的太早我们不能终老 提交于 2019-12-02 16:29:22
目录 一、关于DFS 二、DFS的具体实现 三、剪枝 四、练习 一、关于DFS 1. 什么是DFS 深度优先搜索算法,又称DFS(Depth First Search)。DFS算法是一种搜索算法,而搜索算法实质上是一种枚举,即借助计算机的高性能来有目的地枚举一个问题的部分情况或这个问题的所有情况,进而求出问题的解的一种方法。 2. DFS的搜索方式 根据算法的名字,我们很容易知道DFS是按照深度优先的顺序对所有的状态进行搜索的。 DFS算法是递归算法的一种。搜索时沿着树的深度遍历树的节点,并尽可能深地搜索树的分支(到叶子节点为止)。当节点v的所有边都被访问过时,搜索将回溯到发现节点v的那条边的起始节点。搜索过程一直进行到已发现从源节点可达的所有节点全部被访问为止。 二、DFS的具体实现 搭建一个dfs程序并不困难,真正值得我们注意的是dfs算法的剪枝部分。dfs的剪枝方法因题而异,但归类后大概分为5类。这一点我们稍后会提及。 这里给出一般dfs的框架: void DFS(type n){ //可以描述阶段的状态 if(符合条件) {cout<<答案;return;} //出口 if(可以剪枝) return; //剪枝 for(i:1~p){ //选择该阶段的所有决策 选择可行决策; //剪枝的一种 标记已访问该点; DFS(n+1); //进入下一阶段 (还原访问现场;) } }