实验6无向图中求两点间的所有简单路径

合集下载

第七章图习题答案

第七章图习题答案

第七章图习题答案基础知识:7.1 在图7.23所示的各无向图中:(1)找出所有的简单环。

(2)哪些图是连通图?对非连通图给出其连通分量。

(3)哪些图是自由树(或森林)?答:(1)所有的简单环:(同一个环可以任一顶点作为起点)(a)1231(b)无(c)1231、2342、12341(d)无(2)连通图:(a)、(c)、(d)是连通图,(b)不是连通图,因为从1到2没有路径。

具体连通分量为:(3)自由树(森林):自由树是指没有确定根的树,无回路的连通图称为自由树:(a)不是自由树,因为有回路。

(b)是自由森林,其两个连通分量为两棵自由树。

(c)不是自由树。

(d)是自由树。

7.2 在图7.24(下图)所示的有向图中:(1) 该图是强连通的吗? 若不是,则给出其强连通分量。

(2) 请给出所有的简单路径及有向环。

(3) 请给出每个顶点的度,入度和出度。

(4) 请给出其邻接表、邻接矩阵及逆邻接表。

答:(1)该图是强连通的,所谓强连通是指有向图中任意顶点都存在到其他各顶点的路径。

(2)简单路径是指在一条路径上只有起点和终点可以相同的路径:有v1v2、v2v3、v3v1、v1v4、v4v3、v1v2v3、v2v3v1、v3v1v2、v1v4v3、v4v3v1、v3v1v4、另包括所有有向环,有向环如下:v1v2v3v1、v1v4v3v1(这两个有向环可以任一顶点作为起点和终点)(3)每个顶点的度、入度和出度:D(v1)=3ID(v1)=1OD(v1)=2D(v2)=2 ID(v2)=1OD(v2)=1D(v3)=3 ID(v3)=2OD(v3)=1D(v4)=2 ID(v4)=1OD(v4)=1(4)邻接表:(注意边表中邻接点域的值是顶点的序号,这里顶点的序号是顶点的下标值-1) vertex firstedge next┌─┬─┐┌─┬─┐┌─┬─┐0│v1│─→│ 1│─→│ 3│∧│├─┼─┤├─┼─┤└─┴─┘1│v2│─→│ 2│∧│├─┼─┤├─┼─┤2│v3│─→│ 0│∧│├─┼─┤├─┼─┤3│v4│─→│ 2│∧│└─┴─┘└─┴─┘逆邻接表:┌─┬─┐┌─┬─┐0│v1│─→│ 2│∧│├─┼─┤├─┼─┤1│v2│─→│ 0│∧│├─┼─┤├─┼─┤┌─┬─┐2│v3│─→│ 1│─→│ 3│∧│├─┼─┤├─┼─┤└─┴─┘3│v4│─→│ 0│∧│└─┴─┘└─┴─┘邻接矩阵:0 1 0 10 0 1 01 0 0 00 0 1 07.3 假设图的顶点是A,B...,请根据下述的邻接矩阵画出相应的无向图或有向图。

NOIP信息学竞赛初赛-图论算法基础-专题十一-1

NOIP信息学竞赛初赛-图论算法基础-专题十一-1

专题十一:图论算法基础对于图论算法,NOIP初赛不要求会实现算法,但手工操作还是要会的,复赛是要求会代码实现的。

什么是图一个图是一个序偶<V, E>,记为G =<V, E> 。

V 为顶点集, E 为V 中结点之间的边的集合。

自环:一条边的两个端点是相同的。

重边:两个端点之间有两条以上的边,称他们是重边。

简单图:没有自环和重边的图。

无向边:边是双向的。

有向边:单向边,有箭头。

无向图:只有无向边的图。

有向图:只有有向边的图。

混合图:既有无向边又有有向边。

顶点的度:无向图中,一个顶点相连的边数称为该顶点的度;有向图中,从一个顶点出发的边数称为该顶点得出度;到达该顶点的边数称为它的入度。

图论基本定理:著名的握手定理。

无向图中结点度数的总和等于边数的两倍。

有向图中结点入度的和等于出度的和等于边数。

通路:给定图G中结点和边交替出现的一个序列:v0 e1 v1 e2 v2 …ek vk,若每条边ei的两端点是vi-1 和vi ,那么称该序列是从v0到vk的一条通路。

基本通路(路径):没有重复出现的结点的通路。

图的连通性:若一张无向图的任意两个结点之间都存在通路,那么称该图是连通的。

连通分量:图中连通的顶点与边的集合。

权和网:在图的边给出相关的数,成为权。

权可以表示一个顶点到另一个顶点的距离,耗费等。

带权图一般成为网。

最短路径:对于一张不带权的无向图来说,从s到t的最短路径就是所有从s到t的通路中长度最短的那一条(可能不唯一),通路上的边数称为路径的长度。

完全图:任何两个顶点之间都有边(弧)相连称为完全图。

稀疏图、稠密图:边(弧)很少的图称为稀疏图,反之为稠密图。

图的存储:邻接矩阵在邻接矩阵表示中,除了存放顶点本身信息外,还用一个矩阵表示各个顶点之间的关系。

若(i,j)∈E(G)或〈i,j〉∈E(G),则矩阵中第i行第j列元素值为1,否则为0 。

例如, 下面为两个无向图和有向图对应的邻接矩阵。

无向图中两点最短距离

无向图中两点最短距离
2.算法的基本思想
我们从设计输入的格式开始来将一张路径图抽象为数据,在这里选择用邻接矩阵实现。
我们将城市代号存到一个顶点表中,对应城市代号的下标即为邻接表的顶点标号,
3.程序的流程
(1)图类的构建与实现
这个部分给出图类的基本信息,然后定义并实现各个基本操作。
(2)输入模块
将图的信息抽象为数据后,然后进行输入来实现图的构建。
信息和数据
3.输出数据
输出的形式:根据输入的数据,进行DFS遍历,若能成功,则将所有序列输出,若不能成功,则提示报错。
4.测试样例设计
(1)给出简单的城市路径如:
第一行输入N的值:3
第二行依次输入城市代号:0731 0732 0733
第三行输入城市之间通路的条数:3
之后每一行输入一条边的信息:07310732
程序所能达到的功能:程序要求能够识别输入城市编号列表,高速公路,需要查找路径的两个城市时的错误,能够判断输入的两个城市之间是否存在路径,如果存在路径要求能够将路径输出。
2.输入数据
输入的形式和输入值的范围:本程序要求首先输入一个正整数值N,代表城市总数,然后依次输入城市的代号,可以用四位数字表示。因此,用整数来存储。
public:
Graph() {} // Default constructor
virtual ~Graph() {} // Base destructor
// Initialize a graph of n vertices
virtual void Init(int n) =0;
// Return: the number of vertices and edges
0734 0736
0735 0736

最短路径问题的求解PPT精选文档

最短路径问题的求解PPT精选文档
这种算法最关键的问题就是如何确定估价函数,估价函数越准,则能 越快找到答案。这种算法实现起来并不难,只不过难在找准估价函数,大 家可以自已找相关资料学习和思考。
.
3
最短路径问题的求解
三、等代价搜索法 等代价搜索法也是在宽度优先搜索的基础上进行了部分优化的一种算法,它与
启发式搜索的相似之处都是每次只展开某一个结点(不是展开所有结点),不同之 处在于:它不需要去另找专门的估价函数,而是以该结点到A点的距离作为估价值, 也就是说,等代价搜索法是启发式搜索的一种简化版本。它的大体思路是:
.
2
最短路径问题的求解
二、 启发式搜索 在宽度优先搜索算法的基础上,每次并不是把所有可展开的结点展开,
而是对所有没有展开的结点,利用一个自己确定的估价函数对所有没展开 的结点进行估价,从而找出最应该被展开的结点(也就是说我们要找的答 案最有可能是从该结点展开),而把该结点展开,直到找到目标结点为止。
.
12
最短路径问题的求解
八、Dijkstra算法(从一个顶点到其余各顶点的最短路径,单源最短路径) 例3、如下图,假设C1,C2,C3,C4,C5,C6是六座城市,他们之间的连线表示两 城市间有道路相通,连线旁的数字表示路程。请编写一程序,找出C1到Ci 的最短路径(2≤i≤6),输出路径序列及最短路径的路程长度。
3、由数轴可见,A与A'点相比,A点离原点近,因而保留A点,删除A'点,相应的,B、B'点保留B点, D、D'保留D',E、E'保留E',得到下图:
.
11
最短路径问题的求解
4、此时再以离原点最近的未展开的点B联接的所有点,处理后,再展开离原点最近未展开的D点, 处理后得到如下图的最终结果:

判别无向图中任意两个顶点之间是否存在长度为K的简单路径

判别无向图中任意两个顶点之间是否存在长度为K的简单路径

目录一、问题描述 (2)二、设计思路 (2)三、测试用例设计 (3)四、详细设计 (3)五、调试分析 (5)六、心得体会 (8)七、参考文献 (10)八、附录 (10)九、课程设计评定表 (15)一、问题描述题目: 判别无向图中任意两个顶点之间是否存在长度为K的简单路径。

初始条件:(1)采用邻接表作为存储结构。

(2)编写程序判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径。

(3)测试用例自己设计。

注释:简单路径,即其顶点序列中不含有重现的顶点二、设计思路●存储结构设计1.采用邻接表作为无向图的存储结构,即顶点序列用一维数组描述,每个顶点所连接的边用单链表存储。

2.增设一个一维数组,用于存储搜索简单路径时所访问的节点。

●主要算法设计步骤:1.创建无向图CreateMGaph(MGraph &G)①输入无向图的顶点数、边数。

②给各个顶点命名,采用字符型编号。

③输入每条边所连接的两个顶点,即各顶点间的相通性初始化。

④每输入一条边,则判断其合法性:In(SList &L,char a)。

若输入的顶点对中出现了②中没有的新顶点,则提示相应的出错信息,重新输入一条新的边。

2. 打印出邻接表:void print(MGraph G)以每一个顶点为头指针,打印出与该顶点相邻的所有顶点。

然后换行,顺次打印下面的顶点及其相邻点。

3.搜索任意给出的两个顶点间是否存在长度为K的简单路径若搜索成功则返回成功标志,否则返回失败标志:int Search(MGraph G,int x,int y,int k)。

三.测试用例设计1.输入的顶点数:52.输入的边数;63.各顶点名称:A,B,C,D,E4.各条边所对应的顶点对:(A,D)(A,E)(D,E)(D,B)(C,B)(C,E)5.输入要寻找的顶点对及其简单路径长度分别为:(A,D),4四、详细设计4.1 存储结构说明4.1.1邻接表的存储表示#define MAX_VERTEX_NUM 20 //宏定义,最大顶点数typedef struct ArcNode{ //边表结点int adjvex;struct ArcNode *nextarc;}ArcNode;typedef struct VNode{ //头结点char data;ArcNode *firstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct{AdjList vertices;int n,e;}MGraph; //无向图4.1.2 标记访问过的顶点数组int visited[MAX_VERTEX_NUM]; //访问标志函数4.1.3 存储已访问过的顶点的数组int path[MAX_VERTEX_NUM];4.2 主要函数声明4.2.1 创建无向图void CreateMGaph(MGraph &G)4.2.2 寻找各个顶点的位置char GetValue(MGraph G,int i)4.2.3 判断新输入的顶点是否在图中int IsIn(MGraph G,char m)4.2.4 返回顶点的值char GetValue(MGraph G,int i)4.2.5 打印出邻接表void print(MGraph G)4.2.6 查找两顶点m,n之间是否存在长度为k的简单路径int Search(MGraph G,int x,int y,int k,int visited[],int path[],int d)4.3 主程序int main(){cout<<"--------------创建无向图------------"<<endl<<endl;CreateMGaph(G);cout<<"-----------打印邻接表----------------"<<endl<<endl;print(G);cout<<"----------------寻找长度为K的简单路径--------"<<endl<<endl;cout<<"寻找路径的两个顶点:";cin>>m>>n;cout<<"请输入想寻找的简单路径的长度:";cin>>k;Search(G,x,y,k,visited,path,-1);return 0;}五、调试分析5.1 程序的运行与调试5.1.1 设计程序所应考虑的因素该程序所要执行的操作是比较简单的,但细到微处却有很多要考虑的因素,如果不面面俱到,考虑全面,则会使运行过程过于简单,程序的功能不够完美。

图论算法介绍

图论算法介绍

if (a[i,k]=1)and (a[k,j]=1) then a[i,j]=1 (a[i,j]=1表示i可达j,a[i,j]=0表示i不可达j)。
var
link,longlink:array[1..20,1..20] of boolean;{ 无向图和无向图的传递闭包。其

l o n g l i n k[i,
例如:公路交通图,边以距离w为权。

2
2
1
3
1
3
有向完全图 例
245
无向完全图 5
1
例 1
3
6
图与子图
57
32
46
G2
顶点5的度:3 顶点2的度:4
3
6
例 245
1
3
6
G1
顶点2入度:1 出度:3 顶点4入度:1 出度:0

路径:1,2,3,5,6,3 路径长度:5
245
简单路径:1,2,3,5
❖ 图 G = (V, E)
V = 顶点集 E = 边集 = V V的子集
结点集V={a, b, c, d} 边集E={e1, e2, e3, e4, e5} 其中e1=(a, b), e2=(a, c),
e3=(a, d), e4=(b, c), e5=(c, d)。
(一)、计算无向图的传递闭包
v1→v2→v4→v8→v5 →v3→v6→v7
算法结构:
调用一次dfs(i), 可按深度优先搜索 的顺序访问处理结 点i所在的连通分 支(或强连通分 支),dfs(i)的时 间复杂度为W(n2)。 整个图按深度优先 搜索顺序遍历的过 程如下:
显然,为了避免重复访问同一个顶点,必须 记住每个顶点是否被访问过。为此,可设置 一个布尔向量visited[1..n],它的初值为 false,一旦访问了顶点vi,便将visited[i] 置为ture。 图的深度优先搜索是一个递归过程,可以使 用栈来存储那些暂时不访问的邻接点.类似于 树的前序遍历,它的特点是尽可能先对纵深 方向进行搜索,故称之深度优先搜索。

所有点连起来的最小路径

所有点连起来的最小路径

所有点连起来的最小路径在现代社会中,交通网络已经成为了人们生活中不可或缺的一部分。

无论是城市内部的交通还是城市之间的交通,都需要一个完善的交通网络来支持。

而在这个交通网络中,最关键的就是所有点连起来的最小路径。

什么是所有点连起来的最小路径?简单来说,就是将所有点连接起来的最短路径。

在实际应用中,这个概念非常重要。

比如说,在城市规划中,需要考虑如何让不同的区域之间互相连通;在物流领域中,需要考虑如何让货物在不同的仓库之间快速地运输。

那么,如何寻找所有点连起来的最小路径呢?这需要用到图论中的最小生成树算法。

最小生成树算法是一种用于解决图中最小权值生成树问题的算法。

它的基本思想是从一个点开始,不断地向外扩展,直到将所有点都连接起来,同时保证总权值最小。

最常用的最小生成树算法是Prim算法和Kruskal算法。

Prim算法是从一个点开始,每次选择距离该点最近的未访问过的点,将其加入生成树中。

而Kruskal算法则是将所有边按照权值从小到大排序,依次加入生成树中,直到所有点都连接起来。

下面来举一个实际的例子。

假设有5个城市,它们之间的距离如下表所示:| 城市 | A | B | C | D | E || ---- | ---- | ---- | ---- | ---- | ---- || A | 0 | 7 | 8 | 6 | 999 || B | 7 | 0 | 5 | 999 | 999 || C | 8 | 5 | 0 | 9 | 999 || D | 6 | 999 | 9 | 0 | 11 || E | 999 | 999 | 999 | 11 | 0 |我们需要将这5个城市连接起来,同时保证总距离最小。

首先,我们可以使用Prim算法来求解。

假设从城市A开始,我们可以得到如下的生成树:```A\B/ \C D\E```这个生成树的总距离为20,是所有可能的生成树中最小的。

同样,我们也可以使用Kruskal 算法来求解。

7.2路径及图的连通

7.2路径及图的连通
v1 e2 v7 e1 v2 e4 v3 e5 e3 e6 v8 e7 v4 e11 v9 e8 v5 e10 e9 v6
可知, 可知,{v2,v3},{v3,v4,v5},{v4,v9},{v2}, 是点割集, 是割点。 {v3},{v5} 是点割集,其中 v2, v3, v5是割点。
边割集
设无向图G=<V,E>,若存在边集E E,使 设无向图G=<V,E>,若存在边集E1⊂E,使 G=<V,E>,若存在边集 图G-E1的连通分支数p(G-E1)>p(G),且对任 的连通分支数p(Gp(G),且对任 p(G 意E2⊂E1均有p(G-E2)=p(G),则称E1是G的边 均有p(G )=p(G),则称 p(G则称E 割集,如边割集中只有一条边, 割集,如边割集中只有一条边,则称该边为 割边或桥。 割边或桥。
ቤተ መጻሕፍቲ ባይዱ
边割集例
e1 e2 e3 e4 e6 e5 e7 e11 e8 e9 e10
在G 中, {e1,e2},{e1,e3},{e2,e3},{e4},{e5,e6},{e5, e7},{e6,e7},{e8,e9},{e10} 均是边割集,其中e 是桥。 均是边割集,其中e4,e10是桥。
有有向路, u→v→u构成了一个有向回路 构成了一个有向回路, 有有向路, 则u→v→u 构成了一个有向回路, 如果该有向回路没有包含 w,而u→w,w→u均有有向路 均有有向路, u→v→u→w→u又是一个有向回路 又是一个有向回路, w,而u→w,w→u均有有向路,则u→v→u→w→u又是一个有向回路,一直 下去可以将图中所有的点均包含进去。 下去可以将图中所有的点均包含进去。
v0到v4有一条有向通路 但v4到v0就没有有向通路。 有一条有向通路,但 就没有有向通路。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.抽象数据类型
图的ADT
数据对象:V,R(图是由一个顶点集V和一个弧集R构成的数据结构)
数据关系:Graph = (V,R) VR={<v,w>|v,w∈V且P(v,w)}
基本操作:
int n() =0; //返回图节点数
int e() =0; //返回图边数
int first(int)=0;//返回该节点的第一条邻边
三、详细设计
图的存储:用邻接矩阵来存储:根据输入的顶点个数N创建一个N*N的矩阵,将其全部赋初值。然后根据边的情况来输入对应边的位置。
(一)无向图的基本操作(邻接矩阵)
1.初始化一个有向图
Graphm(int numVert)
{
int i,j;
numVertex = numVert; //顶点数
numEdge=0;
for(i=0;i<numVertex;i++)
if(matrix[v][i]!=0) return i; //当顶点和顶点i有边时,返回顶点i的值return i;
}
int next(int v1,int v2) //获得v1的邻居v2
{
int i;
for(i=v2+1;i<numVertex;i++)
每次要获得顶点对应的下标时,用顶点与数组中数据逐个比较,在相等时返回该值的下标。
int getNum(int *vert,int n,int s)
{
for(int i=0;i<n;i++){
if(vert[i]==s) //如果顶点s等于数组vert[i]的值
return i; } //返回下标
}
(三) DFS找到所有简单路径函数
cin>>v1>>v2;
while((v1!=0)&&(v2!=0))
{ n1=getNum(v,n,v1);
n2=getNum(v,n,v2);
T.setEdge(n1,n2);
T.setEdge(n2,n1);
cout<<"输入不同两个城市的边的关系,区号用空格隔开:"<<endl;
cin>>v1>>v2; }
mark=new int[numVert]; //初始化标志数组
} for(i=0;i<numVertex;i++) mark[i]=0; //每一个顶点的标志值初始化为0 matrix =(int**) new int*[numVertex]; for(i=0;i<numVertex;i++) matrix[i]=new int[numVertex]; //构建一个相邻矩阵for(i=0;i<numVertex;i++) for(j=0;j<numVertex;j++) matrix[i][j]=0;
从起始的城市对应的顶点开始,每访问一个顶点时,将其存入数组,标记值设为1,逐次访问其邻接顶点。如果被访问的点在其此次所在的路径中之前已被访问,或该顶点没有邻接顶点了且该顶点不是目的顶点,则返回上一个顶点置为0,继续查找其他邻接点。
如果该顶点是目的顶点,则将该条路径此次访问的存储顶点的数组输出,输出该条简单路径。之后将上一个顶点置为0,观察是否还有其余邻点,如果有继续查找,如果没有,则返回上一个顶点,置为0,继续用DFS查找简单路径。
}
2.没有路径
if(f==0)
cout<<"查找的两城市间没有简单路径!"<<endl;
(2)输入要求取所有简单路径的两个城市编号。
(3)将所有路径(有城市编号组成)输出到用户指定的文件中。
实现提示
基于DFS的思想。
一、需求分析
城市分布不均,且无向,两个城市之间有路连接,根据特点,可以抽象成一个无向图,城市为各点,高速路为边。按照用户的输入建立一个邻接表,输出两个点的所有路径。
(1)输入的形式和输入值的范围:本程序要求首先输入一个正整数值N,代表城市总数,然后依次输入城市的代号,可以用四位数字表示。因此,用整数来存储。
(2)输出的形式:根据输入的数据,进行输入,若能成功,则将所有序列输出,若不能成功,则提示报错。
(3)程序所能达到的功能:程序要求能够识别输入城市编号列表,高速公路,需要查找路径的两个城市时的错误,能够判断输入的两个城市之间是否存在路径,如果存在路径要求能够将路径输出。
二、概要设计
因为所有顶点的特征一致,并且顶点和其他的多个顶点间可能存在联系,由此顶点之间存在一个网状结构,顶点间的联系与方向无关,所以用一个无向图表示高速公路网,其中顶点表示城市,边表示城市之间的高速公路,数据的对象是图中的每一个顶点和无向边。由此为本问题确定一个图的数据关系。
void setEdge(int v1, int v2)//加边
int next(int, int) =0; //返回下一条邻边
int getMark(int) =0;//有标记吗
void setMark(int, int) =0;//设置标记
2.算法的基本思想
(1)首先将图中每个顶点的访问标志初始化为0,每访问一个点,则访问标记改为1。从图中给定的顶点V出发,访问此顶点,然后依次从V的各个未被访问的邻接点出发深度优先搜索遍历图,每访问一个顶点,访问标记为1,把该点存入数组中,直至在图中遍历到和V有路径相通的目标顶点V0,输出该条简单路径。如果此次路径访问的顶点已经被访问,将上一个顶点访问标志设为0,继续访问其余邻接点,如果没有邻接点,则返回上一个顶点,将访问标志设为0,继续用DFS查找简单路径。如果算法结束,没有简单路径输出,那么输出没有简单路径
{
cout<<"这两个城市间一条的简单路径为:";
flag=1;
for (i=0;i<=d;i++)
cout<<path[i]<<"-->"; //输出该条路径
cout<<endl;
}
for (w=G.first(n);w<G.n();w=G.next(n,w)) //继续查找该顶点的相邻顶点
{
if (G.getMark(w)==0)
if(matrix[v1][i]!=0) return i;
return i;
}
4.其他基本操作
void setEdge(int v1,int v2) //设置无向图的边
{
if(matrix[v1][v2]==0)
numEdge++;
matrix[v1][v2]=1;
}
int getMark(int v) //获取顶点标记的值
2.有向图的销毁
~Graphm()
{
delete []mark;
for(int i=0;i<numVertex;i++)
delete [] matrix[i];
delete [] matrix; //销毁相邻矩阵
}
3.获取第一个邻居
int first(int v) //返回该点的第一条邻边
{
int i;
算法的时空分析
邻接矩阵的空间代价为Θ(|V|2),查找设共计访问的结点次数为k,则易知函数的时间开销为Ɵ(k)。
输入和输出的格式
输入
输入城市数量
输入城市编号
for(i=0;i<n;i++)
{ cout<<"每个城市的区号(四位):"<<endl;
cin>>v[i]; }
输入之间有高速公路连接的城市编号:
实验
背景
简单路径:如果一条路径上的顶点除了起点和终点可以相同外,其它顶点均不相同,则称此路径为一条简单路径。
问题描述
若用无向图表示高速公路网,其中顶点表示城市,边表示城市之间的高速公路。试设计一个找路程序,获取两个城市之间的所有简单路径。
ห้องสมุดไป่ตู้基本要求
(1)输入参数:结点总数,结点的城市编号(4位长的数字,例如电话区号,长沙是0731),连接城市的高速公路(用高速公路连接的两个城市编号标记)。
temp=DFS_all(G,w,v1,path,d,vert,flag);
}
G.setMark(n,0);//恢复,可以再寻找
d--;
return flag;
}
算法的具体步骤
设置一个标志变量flag,赋初值为0,当有一条简单路径输出时,flag变为1。如果DFS结束后flag仍为0,那么输出没有找到简单路径。如图伪代码实现如下:Graphm T; int v[100],path[100]; int flag=0,d=-1; //标志变量flag cout<<"输入城市数量:"; cin>>n; T.CreatGraphm(n); //构建一个n*n的矩阵存放图//获得城市编号//输入不同两个城市的边的关系
(2)图的存储:用邻接矩阵来存储
3.程序的流程
(1)初始化模块:输入城市数量,再输入相应城市编号及相邻城市间的通路路径,构建一个邻接矩阵来初始化一个无向图。
(2)DFS模块:对无向图进行深度优先搜索,查找的两顶点之间若存在通路时的所有简单路径。
(3)输出模块:若两城市(顶点)间存在通路,那么输出所有的简单路径。否则,输出没有简单路径,结束程序。
while((v1!=0)&&(v2!=0))
{
T.setEdge(n1,n2); //无向图中,两顶点间边的关系对称
相关文档
最新文档