求图的简单路径和回路
Hamilton路径和Hamilton回路

8.图论Topics in Graph Theory §8.1 图GraphsG=<V, E,γ>V={v1,v2,······,v n} 顶点vertex集。
E={ e | e=( vi , vj), vi,vj∈V, v i≠v j}无向边edge集。
γ(e)={ v i, v j}, e的端点end points集。
简写为G=(V,E)。
TD(v i)顶点v i的度数degree:连接到v i的边的条数。
连接一个顶点的圈loop算两度。
孤立点isolated vertex:度数为0的点。
两个顶点相邻adjacent:有一边相连。
定理1. (握手定理) TD= TD(v i)=2m.推论. 任意图的奇数度顶点必有偶数多个。
完全图complete graph:任意两点都相邻简单图。
定理2. n个顶点的完全图有n(n-1)/2条边。
正则图regular graph:每个顶点都有相同的度数。
E={<v i, v j>|v i ,v j∈V}有向边集有向图有向边<v i, v j> ,v i 起点弧尾, v j 终点弧头TD(v i ):顶点的度degree: 以v i 为端点的边的数目。
OD(vi): 出度, 以v i 为起点的边的数目。
ID(v i ): 入度,以v i 为终点的边的数目。
TD(v i )= OD(vi)+ ID(v i )OD=ID, TD=2|E|,E| =1/2*TDTD OD ID 为整个图的总度,出度,入度数。
路径path : v i ······v j , 以v i 为起点v j 为终点的顶点序列,相邻顶点相邻。
路径的长length : 路径上边的数目,简单路径simple path :点都不重复的路径,回路circuit : 首尾相接的路径,简单回路simple circuit : 除起点和终点以外都不重复的路径,v i v j 连通connected : 有路径 v i ······v j 相连。
7-2 路与回路

割边e使图G满足W(G-e)>W(G) 。
边连通度(edge-connectivity) (G)定义:非 平凡图的边连通度为
(G)=min{ |E1| 删去的边的最少数目。
| E1是G的边割集}
边连通度 (G)是为了产生一个不连通图需要 (1)若G是平凡图则E1=,(G)=0 (2)若G存在割边,则(G)=1, (3)规定非连通图的边连通度为(G)=0
v2
e5
v4
e6
e8 v1 e3 e2
从v5到v2 v3 的一条 迹,长 e7 度为5
v5 v2
e1
v1 e3 e2
v2
e4 e5 e6 e8
v3
e7
从v4到 v2 v3的一 条通路, e5 长度为4
v4
e1
v3
e4 e6 e8 e7
从v2到 v2的一 条圈, 长度为4
v4
v5
v5
定理7-2.1 在一个具有n个结点的图中,如果从
边连通度、 可达、 弱分图、
单侧连通、 强连通、 弱连通、 强分图、 单侧分图 掌握5个定理,一个推论。
一、路 定义7-2.1 给定图G=<V,E>,设 v0,v1,…,vnV,
e1,…,enE, 其中ei是关联于结点vi-1,vi的边,交替
序列v0e1v1e2…envn称为结点v0到vn的路(拟路径
5、割边 定义7-2.5 设无向图G =<V,E>是连通图,若有边 集E1E,使图 G中删除了E1的所有边后,所得到的
子图是不连通图,而删除了E1的任何真子集后,所 得到的子图仍是连通图,则称E1是G的一个边割集 (cut-set of edges) 。若某一条边就构成一个边割集, 则称该边为割边或桥。
图论1

d<u,v> + d<v,w> ≥ d<u,w> 《定义》:在简单有向图中,若图中任何一 定义》 对结点间,至少有一点到另一结点是可达 的,则称此图是单侧连通的;如果两结 点均是互相可达的,则称是强连通的。 如果在图中略去边的方向,将它看成无向 图后,图是连通的,则称此图为弱连通 的. 强连通⇒单侧连通⇒弱连通
(10)闭路(自回路): 闭路(自回路):图中起始且终止于同一结 闭路 ): 点的边 (闭路的箭头方向是没有意义的 )例:
(11)多重边(平行边): 多重边(平行边):二个结点之间 多重边 ): 方向相同的二条(多条)边 例:
多重图,非多重 《定义》:含有多重边的图称为多重图 定义》 多重图 图称为线图 线图。 线图 简单图: 简单图。 简单图:无自回路的线图称为简单图。由定义可 简单图 见,简单图是没有自回路和多重边的图。 例:
图论不断发展,它在解决运筹学,网络理 论,信息论,控制论,博奕论以及计算 机科学等各个领域的问题时,显示出越 来越大的效果。 对于这样一门应用广泛的学科,其包含的 内容是丰富的,本篇我们只准备介绍基 本的概念和定理,为今后有关学科及课 程的学习和研究提供方便。 第七章 图论
§1图的基本概念
1.基本名词和定义 1.基本名词和定义 定义》 《定义》一个图G是一个三元组<V(G),E(G), ΦG>, 其中V(G)为有限非空结点(或叫顶点)集合, E(G)是边的集合, ΦG是从边集E到结点偶对集 合上的函数。 (1). V(G) ={V1,V2,…,Vn}为有限非空集合, Vi称为结点,简称V是点集。 (2). E(G)={e1,…,em}为有限的边集合,ei称为边。 。 每个边ei都有V中的结点对与之相对应,称E为边集。 。 即每条边是连结V中的某两个点的。
路径、回路及连通性

离散数学导论
λ(G)称为图G的边连通度
(edge-connectivity),定义如下:
0
当G非连通图时
(G) 0
当G为一孤立结点时
min{S : S为G的割集} 否则
ቤተ መጻሕፍቲ ባይዱ
.
路径、回路及连通性 1.3 连通度
✓定理8.9
对任何简单无向图G, χ(G) ≤λ(G) ≤δ(G)
✓定理8.10
设G为n个顶点、m条边的简单
G是单向连通的,如果G的任何两个顶点中,至少从 一个顶点到另一个顶点是可达的;称有向图G是弱连通
的,如果G的有向边被看作无向边时是连通的
.
路径、回路及连通性 1.2 连通性
➢定义8.13
图G’称为图G的连通分支
(connected components),如果G’是G的子图, G’是连通的,并且不存在G的真子图G’’,使G’’ 是连通的,且G’’以G’为真子图。
.
路径、回路及连通性 1.2 连通性
✓ 定义8.11
称图中顶点u到v是可达的
(accesible),如果u = v,或者有一 条u到v的路径。
.
路径、回路及连通性 1.2 连通性
➢ 定义8.12
称无向图G是连通的(connected),如果G的 任何两个顶点都是相互可达的。称有向图G是强连通
的,如果G的任何两个顶点都是相互可达的;称有向图
且ei( i= 1,2, … ,l-1 )以vi及vi+1为端点,
(对有向图G,ei以vi为起点,以vi+1为终点),
该拟路径所含的边数l-1称为该拟路径的长度。
当ei( i= 1,2, …, l-1 )各不相同时,该拟路径称为路径 (walk),又当vi(i = 1,2, … ,l)各不相同时(除v1=vl), 则称此路径为通路(Path)。v1=vl的路径称为闭路径 (closed walk);v1= vl的通路称为回路(circuit)。
简单通路与回路

(4) 复杂通路与回路:有边重复出现
1
ห้องสมุดไป่ตู้
几点说明
表示法 ① 定义表示法 ② 只用边表示法 ③ 只用顶点表示法(在简单图中) ④ 混合表示法
14.2 通路与回路
定义14.11 给定图G=<V,E>(无向或有向的),G中顶点与
边的交替序列 = v0e1v1e2…elvl,vi1, vi 是 ei 的端点. (1) 通路与回路: 为通路;若 v0=vl, 为回路,l 为回路长
度.
(2) 简单通路与回路:所有边各异, 为简单通路,又若v0=vl, 为简单回路
2
通路与回路的长度
定理14.5 在n 阶图G中,若从顶点vi 到vj(vivj)存在通路, 则从vi 到 vj 存在长度小于或等于n1 的通路. 推论 在 n 阶图G中,若从顶点vi 到 vj(vivj)存在通路,则 从vi 到vj 存在长度小于或等于n1的初级通路(路径). 定理14.6 在一个n 阶图G中,若存在 vi 到自身的回路,则一 定存在vi 到自身长度小于或等于 n 的回路. 推论 在一个n 阶图G中,若存在 vi 到自身的简单回路,则一 定存在长度小于或等于n 的初级回路.
3
环(长为1的圈)的长度为1,两条平行边构成的圈长度为 2,无向简单图中,圈长3,有向简单图中圈的长度2.
不同的圈(以长度3的为例) ① 定义意义下 无向图:图中长度为l(l3)的圈,定义意义下为2l个 有向图:图中长度为l(l3)的圈,定义意义下为l个 ② 同构意义下:长度相同的圈均为1个
试讨论l=3和l=4的情况
第五章_图论2

通路定理
[定理]通路定理 在n阶图G中,如果有顶点u到v (u v) 的通路,那么u到v必有一条长度小于等
于n1的基本通路。
7
通路定理证明
定理:在有n个顶点的图G中,如果有顶点u到v的通路,必有长 度不大于n-1的基本通路。
证明:(1)先证明u和v之间存在基本通路 若uv之间的通路P中有相同的顶点,则从P中删除相同顶点之间
路径,直到P中没有相同顶点,这样得到的路径为u和v之间的基 本通路。
(2) 再证基本通路长度不大于n-1 (反证法)设u和v之间的基本通路的长度≥n。 ∵ 一条边关联两个顶点, ∴长度≥n的基本通路上至少有n+1个顶点。 ∴至少有两个相同顶点在u和v之间的基本通路上,这与基本通路 的性质“任意两个顶点不同”相矛盾。
图G从vi点到vj点有通路当且仅当?
bij = 1
21
图的连通性与可达矩阵
有向图的连通性(n1): 设有向图G的可达矩阵为B
(1) G强连通 B中元素全为1 (2) G是单向连通的 B中所有关于主对角线对称
的两个元素中至少一个值为1
无向图的连通性(n1): 设无向图G的可达矩阵为B
G连通 B中元素全为1
[定义]基本通(回)路
结点各不相同的通路称为基本通路。 中间结点各不相同的回路称为基本回路。
A
基本通路:ACEBD
B
E
基本回路:ABCDEA
C
D
5
有向通(回)路
[定义]有向通(回)路 若通路v0v1 … vn各边是有向边,且vi-1和vi 分别是有向边的始点与终点,则称该通路为 有向通(回)路。
通路uxv相连。
由u和v的任意性,可知~G是连通的。
27
求图的简单路径和回路

求图的简单路径和回路下面是用邻接表存储无向图,然后输出图中指定顶点间的指定长度的简单路径,简单路径就是路径中的顶点不重复,还有一个就是求出图中经过某顶点的回路,都是对图的遍历算法的应用,主要是深度优先的遍历,加上简单的回溯。
下面是代码//文件"graph.h"#include <iostrea m>#include <string>#include <queue>using namespa ce std;bool visited[20];int path[20];structArcNode{int adjvex;ArcNode *nextarc;};structVexNode{stringdata;ArcNode *firstar c;};class NDGraph{private:VexNode vertice s[20];int vexnum;int arcnum;public:NDGraph(){vexnum=0;arcnum=0;}int GetVexN um(){returnvexnum;}int Locate_Vex(stringv){for(int i=0;i<vexnum;i++)if(vertice s[i].data == v)returni;return-1;}void Create_NDGrap h(){//构造无向图stringv1,v2;int i,j,k;cout<<"输入顶点数和边数:";cin>>vexnum>>arcnum;while(vexnum>20){cout<<"请输入少于20个顶点(重新输入顶点数和边数):"; cin>>vexnum>>arcnum;}cout<<"输入顶点名称:";for(i=0;i<vexnum;i++){cin>>vertice s[i].data;vertice s[i].firstar c=NULL;}for(k=0;k<arcnum;k++){cout<<"输入每条边对应的两个顶点:";cin>>v1>>v2;i=Locate_V ex(v1);j=Locate_V ex(v2);while(i == -1 || j == -1){cout<<"顶点中有不符合要求的,请重新输入:";cin>>v1>>v2;i=Locate_V ex(v1);j=Locate_V ex(v2);}ArcNode *p=new ArcNode;p->adjvex=j;p->nextarc=vertice s[i].firstar c;vertice s[i].firstar c=p;//置对称边ArcNode *q=new ArcNode;q->adjvex=i;q->nextarc=vertice s[j].firstar c;vertice s[j].firstar c=q;}cout<<"无向图构造完成"<<endl;}void DFS_Tra verse(){for(int i=0;i<vexnum;i++)visited[i]=false;for(i=0;i<vexnum;i++)if(!visited[i])DFS(i);}void DFS(int v){visited[v]=true;cout<<vertice s[v].data<<" ";ArcNode *p;int w;for(p=vertice s[v].firstar c;p;p=p->nextarc) {w=p->adjvex;if(!visited[w])DFS(w);}}void BFS_Tra verse(){for(int i=0;i<vexnum;i++)visited[i]=false;for(i=0;i<vexnum;i++)if(!visited[i])BFS(i);}void BFS(int v){visited[v]=true;cout<<vertice s[v].data<<" ";queue<int> qu;int w,k;ArcNode *p=NULL;qu.push(v);while(!qu.empty()){w=qu.front();qu.pop();for(p=vertice s[w].firstar c;p;p=p->nextarc){k=p->adjvex;if(!visited[k]){visited[k]=true;cout<<vertice s[k].data<<" ";qu.push(k);}}}}void Print_X_Y_Pat h(int u,int v,int l,int d){//求出一条长度为l的从u到v的路径,d刚进来的时候是-1 int m;d++;visited[u]=true;path[d]=u;if(u == v && d == l) //找到一条路径{for(int i=0;i<l;i++)cout<<vertice s[ path[i] ].data<<"-->";cout<<vertice s[ path[i] ].data<<endl;}else if(u == v && d!=l){//出现这种情况直接回溯上一顶点,不浪费时间去D FS goto loop;}else{ArcNode *p=vertice s[u].firstar c; //继续DFSwhile(p){m=p->adjvex;if(!visited[m])Print_X_Y_Pat h(m,v,l,d);p=p->nextarc;}}//恢复环境,使顶点可重新使用//路径长度减一loop: visited[u]=false;d--;}void Print_X_X_Pat h(int i,int j,int d){//找出从i到i的回路,思想和上面的类似int v,k;ArcNode *p;visited[i]=true;d++;path[d]=i;if(i == j && d>2){for(k=0;k<d;k++)cout<<vertice s[ path[k] ].data<<"-->";cout<<vertice s[ path[k] ].data<<endl;}else if(i == j && d==2) //一条边只可以走一次goto lop;else{p=vertice s[i].firstar c;while(p){v=p->adjvex;if(!visited[v] || v == j)Print_X_X_Pat h(v,j,d);p=p->nextarc;}}lop: visited[i]=false;d--;}};主函数文件#include "graph.h"#include <iostrea m>#include <string>using namespa ce std;int main(){NDGraph G;stringv1,v2;int u,v;int num;G.Create_NDGrap h();cout<<"图的深度优先遍历为:";G.DFS_Tra verse();cout<<endl;cout<<"图的广度优先遍历为:";G.BFS_Tra verse();cout<<endl;cout<<"输入两个顶点名称和一个数字,"<<endl;cout<<"将输出长度为输入数字大小的两顶点间路径:";cin>>v1>>v2>>num;u=G.Locate_V ex(v1);v=G.Locate_V ex(v2);if(u == -1 || v == -1){cout<<"顶点中有不符合要求的,操作失败"<<endl;}else{for(int i=0;i<G.GetVexN um();i++)visited[i]=false;cout<<"顶点 "<<v1<<" 到 "<<v2<<" 长度为 "<<num<<" 的简单路径如下:"<<endl;G.Print_X_Y_Pat h(u,v,num,-1);}cout<<"输入一个顶点名称,将输出所有经过它的回路:";cin>>v1;u=G.Locate_V ex(v1);if(u == -1){cout<<"顶点不存在,操作失败"<<endl;}else{for(v=0;v<G.GetVexN um();v++)visited[v]=false;cout<<"经过顶点 "<<v1<<" 的所有回路如下:"<<endl;G.Print_X_X_Pat h(u,u,-1);}return0;}输入顶点数和边数:5 6输入顶点名称:v1 v2 v3 v4 v5输入每条边对应的两个顶点:v1 v2输入每条边对应的两个顶点:v1 v4输入每条边对应的两个顶点:v2 v4输入每条边对应的两个顶点:v2 v3输入每条边对应的两个顶点:v3 v5输入每条边对应的两个顶点:v4 v5无向图构造完成图的深度优先遍历为:v1 v4 v5 v3 v2图的广度优先遍历为:v1 v4 v2 v5 v3输入两个顶点名称和一个数字,将输出长度为输入数字大小的两顶点间路径:v1 v3 3顶点 v1 到 v3 长度为 3 的简单路径如下:v1-->v4-->v5-->v3v1-->v4-->v2-->v3输入一个顶点名称,将输出所有经过它的回路:v4经过顶点 v4 的所有回路如下:v4-->v5-->v3-->v2-->v4v4-->v5-->v3-->v2-->v1-->v4v4-->v2-->v3-->v5-->v4v4-->v2-->v1-->v4v4-->v1-->v2-->v3-->v5-->v4v4-->v1-->v2-->v4Press any key to continu e下面是生成的无向图示例:为了更好得理解回溯的过程,可以画画像下面这样的示意图,比如我求V1 到V3的长度为3的路径的过程图可能和你画的不一样,但是主要就是理清一下思路,不会在一重重的递归中乱掉。
离散数学中初级回路和简单回路

离散数学中初级回路和简单回路离散数学是一门研究离散量和离散结构的学科,在其中初级回路和简单回路是常见概念之一。
本文将介绍初级回路和简单回路的概念、性质及应用。
一、初级回路和简单回路的概念1.初级回路初级回路又称为欧拉回路,是指经过图中每个边恰好一次的回路。
当图G中存在欧拉回路,G被称为欧拉图。
欧拉回路必须是连通图,而且每个顶点的度数都是偶数。
同样地,对于 n 个顶点的简单连通图 G,G 是欧拉图当且仅当它的每个顶点的度数都是偶数。
2.简单回路简单回路又称为哈密顿回路,是指经过图中每个顶点恰好一次的回路。
当图G中存在简单回路,G被称为哈密顿图。
在实际应用中,初级回路和简单回路有着不同的价值,前者被广泛应用于城市规划、通信网络等领域,而后者则被用于模拟电路、运输路线等问题的求解。
二、初级回路和简单回路的性质1.初级回路的性质对于 n 个顶点的欧拉图 G,设k 是一个连通分量,则 G 是欧拉图当且仅当 G 的每个连通分量都是欧拉图。
2.简单回路的性质对于 n 个顶点的简单连通图 G,如果 v 是 G 的一点,则 G 是哈密顿图当且仅当 G-v 是哈密顿图。
3.初级回路和简单回路的关系对于 n 个顶点的连通图 G,如果 G 是欧拉图,那么 G 必须是哈密顿图。
但反过来并不成立,即哈密顿图不一定是欧拉图。
三、初级回路和简单回路的应用1.初级回路的应用欧拉回路被广泛应用于城市规划、通信网络等领域。
以城市规划为例,欧拉回路可以用来规划城市的交通系统,以实现绿色出行,节约能源,减少碳排放等目的。
同时,欧拉回路还可以用来测试网络中的通信障碍,以及计算机网络中的最短路径等问题。
2.简单回路的应用哈密顿回路被广泛应用于模拟电路、物流运输等领域。
以模拟电路为例,哈密顿回路可以用来分析电路中的开闭电路问题,以实现电路的优化设计和性能最大化。
同时,哈密顿回路还可以用来计算物流运输中的最短路径问题,以实现物流效率的提升。
总之,初级回路和简单回路是离散数学中的常见概念,具有重要的理论和实际应用价值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
求图的简单路径和回路下面是用邻接表存储无向图,然后输出图中指定顶点间的指定长度的简单路径,简单路径就是路径中的顶点不重复,还有一个就是求出图中经过某顶点的回路,都是对图的遍历算法的应用,主要是深度优先的遍历,加上简单的回溯。
下面是代码//文件"graph.h"#include <iostream>#include <string>#include <queue>using namespace std;bool visited[20];int path[20];struct ArcNode{int adjvex;ArcNode *nextarc;};struct VexNode{string data;ArcNode *firstarc;};class NDGraph{private:VexNode vertices[20];int vexnum;int arcnum;public:NDGraph(){vexnum=0;arcnum=0;}int GetVexNum(){return vexnum;}int Locate_Vex(string v){for(int i=0;i<vexnum;i++)if(vertices[i].data == v)return i;return -1;}void Create_NDGraph(){//构造无向图string v1,v2;int i,j,k;cout<<"输入顶点数和边数:";cin>>vexnum>>arcnum;while(vexnum>20){cout<<"请输入少于20个顶点(重新输入顶点数和边数):"; cin>>vexnum>>arcnum;}cout<<"输入顶点名称:";for(i=0;i<vexnum;i++){cin>>vertices[i].data;vertices[i].firstarc=NULL;}for(k=0;k<arcnum;k++){cout<<"输入每条边对应的两个顶点:";cin>>v1>>v2;i=Locate_Vex(v1);j=Locate_Vex(v2);while(i == -1 || j == -1){cout<<"顶点中有不符合要求的,请重新输入:";cin>>v1>>v2;i=Locate_Vex(v1);j=Locate_Vex(v2);}ArcNode *p=new ArcNode;p->adjvex=j;p->nextarc=vertices[i].firstarc;vertices[i].firstarc=p;//置对称边ArcNode *q=new ArcNode;q->adjvex=i;q->nextarc=vertices[j].firstarc;vertices[j].firstarc=q;}cout<<"无向图构造完成"<<endl;}void DFS_Traverse(){for(int i=0;i<vexnum;i++)visited[i]=false;for(i=0;i<vexnum;i++)if(!visited[i])DFS(i);}void DFS(int v){visited[v]=true;cout<<vertices[v].data<<" ";ArcNode *p;int w;for(p=vertices[v].firstarc;p;p=p->nextarc) {w=p->adjvex;if(!visited[w])DFS(w);}}void BFS_Traverse(){for(int i=0;i<vexnum;i++)visited[i]=false;for(i=0;i<vexnum;i++)if(!visited[i])BFS(i);}void BFS(int v){visited[v]=true;cout<<vertices[v].data<<" ";queue<int> qu;int w,k;ArcNode *p=NULL;qu.push(v);while(!qu.empty()){w=qu.front();qu.pop();for(p=vertices[w].firstarc;p;p=p->nextarc){k=p->adjvex;if(!visited[k]){visited[k]=true;cout<<vertices[k].data<<" ";qu.push(k);}}}}void Print_X_Y_Path(int u,int v,int l,int d){//求出一条长度为l的从u到v的路径,d刚进来的时候是-1 int m;d++;visited[u]=true;path[d]=u;if(u == v && d == l) //找到一条路径{for(int i=0;i<l;i++)cout<<vertices[ path[i] ].data<<"-->";cout<<vertices[ path[i] ].data<<endl;}else if(u == v && d!=l){//出现这种情况直接回溯上一顶点,不浪费时间去DFS goto loop;}else{ArcNode *p=vertices[u].firstarc; //继续DFSwhile(p){m=p->adjvex;if(!visited[m])Print_X_Y_Path(m,v,l,d);p=p->nextarc;}}//恢复环境,使顶点可重新使用//路径长度减一loop: visited[u]=false;d--;}void Print_X_X_Path(int i,int j,int d){//找出从i到i的回路,思想和上面的类似int v,k;ArcNode *p;visited[i]=true;d++;path[d]=i;if(i == j && d>2){for(k=0;k<d;k++)cout<<vertices[ path[k] ].data<<"-->";cout<<vertices[ path[k] ].data<<endl;}else if(i == j && d==2) //一条边只可以走一次goto lop;else{p=vertices[i].firstarc;while(p){v=p->adjvex;if(!visited[v] || v == j)Print_X_X_Path(v,j,d);p=p->nextarc;}}lop: visited[i]=false;d--;}};主函数文件#include "graph.h"#include <iostream>#include <string>using namespace std;int main(){NDGraph G;string v1,v2;int u,v;int num;G.Create_NDGraph();cout<<"图的深度优先遍历为:";G.DFS_Traverse();cout<<endl;cout<<"图的广度优先遍历为:";G.BFS_Traverse();cout<<endl;cout<<"输入两个顶点名称和一个数字,"<<endl;cout<<"将输出长度为输入数字大小的两顶点间路径:";cin>>v1>>v2>>num;u=G.Locate_Vex(v1);v=G.Locate_Vex(v2);if(u == -1 || v == -1){cout<<"顶点中有不符合要求的,操作失败"<<endl;}else{for(int i=0;i<G.GetVexNum();i++)visited[i]=false;cout<<"顶点 "<<v1<<" 到 "<<v2<<" 长度为 "<<num<<" 的简单路径如下:"<<endl;G.Print_X_Y_Path(u,v,num,-1);}cout<<"输入一个顶点名称,将输出所有经过它的回路:";cin>>v1;u=G.Locate_Vex(v1);if(u == -1){cout<<"顶点不存在,操作失败"<<endl;}else{for(v=0;v<G.GetVexNum();v++)visited[v]=false;cout<<"经过顶点 "<<v1<<" 的所有回路如下:"<<endl;G.Print_X_X_Path(u,u,-1);}return 0;}输入顶点数和边数:5 6输入顶点名称:v1 v2 v3 v4 v5输入每条边对应的两个顶点:v1 v2输入每条边对应的两个顶点:v1 v4输入每条边对应的两个顶点:v2 v4输入每条边对应的两个顶点:v2 v3输入每条边对应的两个顶点:v3 v5输入每条边对应的两个顶点:v4 v5无向图构造完成图的深度优先遍历为:v1 v4 v5 v3 v2图的广度优先遍历为:v1 v4 v2 v5 v3输入两个顶点名称和一个数字,将输出长度为输入数字大小的两顶点间路径:v1 v3 3顶点 v1 到 v3 长度为 3 的简单路径如下:v1-->v4-->v5-->v3v1-->v4-->v2-->v3输入一个顶点名称,将输出所有经过它的回路:v4经过顶点 v4 的所有回路如下:v4-->v5-->v3-->v2-->v4v4-->v5-->v3-->v2-->v1-->v4v4-->v2-->v3-->v5-->v4v4-->v2-->v1-->v4v4-->v1-->v2-->v3-->v5-->v4v4-->v1-->v2-->v4Press any key to continue下面是生成的无向图示例:为了更好得理解回溯的过程,可以画画像下面这样的示意图,比如我求V1 到V3的长度为3的路径的过程图可能和你画的不一样,但是主要就是理清一下思路,不会在一重重的递归中乱掉。