图的深度广度优先搜索

深度

  1 #include <iostream>
  2 #include <cstdio>
  3 #define max 100
  4 using namespace std;
  5 bool visited[max]={0};
  6
  7 typedef struct node
  8 {
  9     int Vertix[max];
 10     int relation[max][max];
 11     int V,R;
 12 }MGraph;
 13 //获取顶点下标
 14 int locateV(MGraph *M,int x)
 15 {
 16     for(int i=0;i<M->V;i++)
 17     {
 18         if(M->Vertix[i]==x)
 19             return i;
 20     }
 21 }
 22 //构造无向图
 23 void Creat_WX(MGraph *M)
 24 {
 25     scanf("%d%d",&M->V,&M->R);
 26     for(int i=0;i<M->V;i++)
 27     {
 28         scanf("%d",&M->Vertix[i]);
 29     }
 30     for(int i=0;i<M->V;i++)
 31     {
 32         for(int j=0;j<M->V;j++)
 33         {
 34             M->relation[i][j]=0;
 35         }
 36     }
 37     for(int i=0;i<M->R;i++)
 38     {
 39         int v1,v2;
 40         scanf("%d%d",&v1,&v2);
 41         int x1 = locateV(M,v1);
 42         int y1 = locateV(M,v2);
 43         M->relation[x1][y1]=1;
 44         M->relation[y1][x1]=1;
 45     }
 46 }
 47 int FirstIdx(MGraph *M,int v)
 48 {
 49     for(int i=0;i<M->V;i++)
 50     {
 51         if(M->relation[i][v])
 52         {
 53             return i;
 54         }
 55     }
 56     return -1;
 57 }
 58 int NextIdx(MGraph *M,int v,int w)
 59 {
 60     for(int i=w+1;i<M->V;i++)
 61     {
 62         if(M->relation[i][v])
 63         {
 64             return i;
 65         }
 66     }
 67     return -1;
 68 }
 69 void DFS(MGraph *M,int v)
 70 {
 71     visited[v]=1;
 72     printf("%d ",M->Vertix[v]);
 73
 74     for(int i=FirstIdx(M,v);i>=0;i=NextIdx(M,v,i))
 75     {
 76         if(!visited[i])
 77             DFS(M,i);
 78     }
 79 }
 80 void DFSTraverse(MGraph *M)
 81 {
 82     int v;
 83     for(v=0;v<M->V;v++)
 84     {
 85         if(!visited[v])
 86         {
 87             DFS(M,v);
 88         }
 89     }
 90 }
 91 int main()
 92 {
 93     MGraph M;
 94     Creat_WX(&M);
 95     for(int i=0;i<M.V;i++)
 96     {
 97         for(int j=0;j<M.V;j++)
 98         {
 99             printf("%d ",M.relation[i][j]);
100         }
101         printf("\n");
102     }
103     DFSTraverse(&M);
104 }
105 /*
106 测试样例
107 8 9
108 1 2 3 4 5 6 7 8
109 1 2
110 2 4
111 2 5
112 4 8
113 5 8
114 1 3
115 3 6
116 6 7
117 7 3
118 */

原文地址:https://www.cnblogs.com/moumangtai/p/10084029.html

时间: 2024-08-04 21:56:43

图的深度广度优先搜索的相关文章

矩阵图中的广度优先搜索

经常会有类似的题目,如迷宫问题,在一个矩阵图中给定出发点和目标点,每次只能上下左右移动,求到目标点的最短走法,或者说是一共有多少种走法. 思路其实很简单,深搜.广搜.相对比较而言,广度优先搜索更加实用于求最短的走法(步数) 在矩阵图中的广搜需要注意一下几点. 1.确定每步的走法:不同题的走法可能不同,每次搜索时将走法保存在数组中. 2.确定初始状态 往往注意刚开始得起点(i,j)必须把MAP(i,j)改变为 -1(或者其他的),栈中第一个元素即为初始状态 3.保存状态.这点很重要.需要用数组或者

二叉树的最小深度——广度优先搜索

题目描述: 给定一个二叉树,找出其最小深度. 二叉树的最小深度为根节点到最近叶子节点的距离. 解题思路: 这个题目比较简单. 对于二叉树的问题,首先想到的是采用递归,广度优先搜索. 一个节点一个节点地遍历,直到第一次找到叶子节点为止. 注意编程的细节,代码里面有注释 参考代码:(C++) <span style="font-size:18px;">/** * Definition of TreeNode: * class TreeNode { * public: * int

JavaScript实现图的深度广度优先遍历

function Graph(v) { this.vertices = v; //初始化顶点 this.edges = 0; //边数先设置为0 this.adj = []; //为每一个顶点准备一个链表,表示它和所有节点的关系 for (var i = 0; i < this.vertices.length; i++) { this.adj[i] = []; this.adj[i].push(""); } this.addEdge = addEdge; this.toStrin

图的遍历(深度优先与广度优先搜索两种方案)

1.图的遍历--深度优先搜索 import java.util.Scanner ; public class Map{ static int n ; static int m ; static int[] book ; static int[][] e ; public static void mapDfs(int cur){ //深度优先搜索思想核心: System.out.print(cur + " ") ; for (int i=1;i<=n;i++) { if (e[cu

图的遍历之深度优先搜索和广度优先搜索

转自:http://www.cnblogs.com/skywang12345/ 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到. 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访

十大基础实用算法之深度优先搜索和广度优先搜索

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.它沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.DFS属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相

深度&amp;&amp;广度优先算法

深度&&广度优先算法 1.爬虫系列 深度&广度优先搜索 介绍 1.DFS(Depth-First-Search)深度优先搜索,是计算机术语,是一种在开发爬虫早期使用较多的方法, 是搜索算法的一种.它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) . 深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到这个HTML文件,再继续选择该HTML文件中的其他超链. 当不再有其他超链可选择时,说明搜索已经结束. 深度优先搜索是一个递归的过程 2.深度优先

广度优先搜索基础

一.广搜的特性(队列状态之特性) 当使用BFS遍历一张无权图,每次从队列中取出队首进行一系列扩展,将扩展成功结点放入队尾中: 这样的操作会使得整队列满足"两段性",即对于这张搜索树中队列只会保留两层的结点: 证明: 第p层结点扩展时只会扩展第p+1层结点,不会越级扩展p+k层结点(p >= 1&&k >= 2): 初始的时候队列中只有一层的结点(或者起始点): 一+二推得:该队列只保留了不超过两层的结点: 由于是"两段性",而从起始点到达

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

1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点)开始,沿着铁轨(边)移动到其他城市(顶点),有两种方法可以用来搜索图:深度优先搜索(DFS)和广度优先搜索(BFS).它们最终都会到达所有连通的顶点,深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现,不同的实现机制导致不同的搜索方式. 1.1 深度优先搜索 深度优先搜索算法有如下规则: 规则1