图的深度优先搜索

#include<iostream>
using namespace std;
#define MAX 9999
int book[101],n,e[101][101],min=MAX;//cur是当前所在的城市,dis是当前已经走过的路径
void dfs(int cur,int dis)
{
	int j;
	if(dis>min) return;
	if(cur==n)
	{
		if(dis<min) min=dis;
		return;
	}
	for(j=1;j<=n;j++)
	{if(e[cur][j]!=MAX&&book[j]==0)
	{
		book[j]=1;
		dfs(j,dis+e[cur][j]);
		book[j]=0;
	}
	}
	return;
}
int main()
{
	int i,j,m,a,b,c;
	cin>>n>>m;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(i==j) e[i][j]=0;
			else e[i][j]=MAX;
		}
	}
	for(i=1;i<=m;i++)
	{
		cin>>a>>b>>c;
		e[a][b]=c;
	}
	book[1]=1;
	dfs(1,0);
	cout<<min;
	return 0;
}
时间: 2024-08-10 01:57:47

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

图的深度优先搜索 递归和非递归实现 c++版本

本文参考了李春葆版本的数据结构上机指导,但是原版是c代码, 本文用了c++实现,并且修复了深度优先搜索非递归的一个bug. graph.cpp文件: #include "graph.h" #include <queue> #include <stack> int visited[MAXV ]; MGraph ::MGraph(int A[100][10], int nn , int ee) { e= ee ; n= nn ; for (int i=0;i<

图的深度优先搜索(DFS)简介与实现(递归与非递归方法)

上一篇刚刚学习了C++图的实现,今天对深度优先搜索(DFS)进行了一定学习,并作出一定实现.在本文中图的实现,以及相应的函数调用(如获得第一个邻接顶点.获得下一个邻接顶点等)均是基于上文中的实现,故如果想参考测试代码,还需导入上文中相应的类定义.关于C++图的实现可参考此处,这里实现了对图的邻接表以及邻接矩阵两种实现,而本文的深度优先搜索对于上面两种实现均是可行的. 当然,对于图的深度优先搜索的相关定义,本文也不再过多赘述,维基的解释应该就足够,下面将探讨其实现. 1.深度优先搜索的非递归实现:

图的深度优先搜索及拓扑排序

本文将介绍图的深度优先搜索,并实现基于深度优先搜索的拓扑排序(拓扑排序适用于有向无环图,下面详细介绍). 1. 图的深度优先遍历要解决的问题 图的深度优先搜索与树的深度优先搜索类似,但是对图进行深度优先搜索要解决一个问题,那就是顶点的重复访问,假设图中存在一个环路A-B-C-A,那么对顶点A进行展开后得到B,对B进行展开后得到C,然后对C进行展开后得到A,然后A就被重复访问了... 这显然是不对的!我们需要用一个状态变量来记录一个顶点被访问和被展开的状态.在<算法导论>中,作者使用3种颜色来对

&quot;《算法导论》之‘图’&quot;:深度优先搜索、宽度优先搜索及连通分量

本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步.  1. 深度优先搜索  1.1 迷宫搜索 在<算法>这本书中,作者写了很好的一个故事.这个故事让我马上理解了深度优先搜索的思想. 如下图1-1所示,如何在这个迷宫中找到出路呢?方法见图1-2. 图1-1 等价的迷宫模型 探索迷宫而不迷路的一种古老办法(至少可以追溯到忒修斯和米诺陶的传说)叫做Tremaux搜

算法_图的深度优先搜索和广度优先搜索

一.图的基本数据结构 图是由一组顶点和一组能够将两个顶点相互连接的边所构成的,一般使用0~V-1这样的数字形式来表示一张含有V个顶点的图.用v-w来指代一张图的边,由于是无向图,因此v-w和w-v是同一种边的两种表示方法.无向图是指边没有方向的图结构在无向图中,边仅仅表示的是两个顶点之间的连接.图的数据结构的可视化如下图所示(其中边上的箭头没有任何意义): 当两个顶点通过一条边相互连接,则称这两个顶点是相邻的.某个顶点的度数即为依附它的边的总数.当两个顶点之间存在一条连接双方的路径的时候,称为这

图的深度优先搜索与广度优先搜索

无向图的深度优先搜索与广度优先搜索 #include "stdafx.h" #include<vector> #include<iostream> using namespace std; #define N 9 typedef struct{ int vexnum, arcnum; char vexs[N]; int matirx[N][N]; }graph; graph g; int a[N] = { 0 }; // 初始化图数据 // 0---1---2-

图的深度优先搜索和广度优先搜索算法、最小生成树两种算法 --C++实现

一:通用图结构 #ifndef _GRAPH_H #define _GRAPH_H #include <iostream> #include <string.h> #include <assert.h> #include <queue> using namespace::std; #define MAX_COST 0x7FFFFFFF //花费无限大设为整型最大值 ///////////////////////////////////////////////

【js数据结构】图的深度优先搜索与广度优先搜索

图类的构建 function Graph(v) {this.vertices = v;this.edges = 0;this.adj = []; for (var i = 0; i < this.vertices; ++i) { this.adj[i] = []; this.adj[i].push(""); } this.addEdge = addEdge; this.showGraph = showGraph; } function addEdge(v, w) { this.a

邻接矩阵实现图的深度优先搜索(2)

/*树的邻接矩阵的存储结构*/ #include <stdio.h> #include <stdlib.h> #define MAXVEX 10 #define InitEdge 0 typedef char VertexType; typedef int EdgeType; typedef struct MGraph { VertexType vex[MAXVEX]; EdgeType arc[MAXVEX][MAXVEX]; int numVertexes; int numEd

图的深度优先搜索(非递归)

样例输入 4 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 样例输出 0 1 3 2 1 #include <stdio.h> 2 #include <memory.h> 3 #define COUNT 55 4 typedef struct { 5 int arc[COUNT][COUNT]; 6 int verNum; 7 }Graph; 8 void create(Graph *G){ 9 scanf("%d",&G->ve