问题及代码:
01./*
02.* Copyright (c)2016,烟台大学计算机与控制工程学院
03.* All rights reserved.
04.* 文件名称:zhou.cpp
05.* 作 者:吕方舟
06.* 完成日期:2016年11月27日
07.* 版 本 号:v1.0
08.* 问题描述:求图中通过某顶点k的所有简单回路(若存在)
09.*/
10.#include <stdio.h>
11.#include <malloc.h>
12.#include "graph.h"
13.int visited[MAXV]; //全局变量
14.void DFSPath(ALGraph *G,int u,int v,int path[],int d)
15.//d是到当前为止已走过的路径长度,调用时初值为-1
16.{
17. int w,i;
18. ArcNode *p;
19. visited[u]=1;
20. d++;
21. path[d]=u;
22. p=G->adjlist[u].firstarc; //p指向顶点u的第一条边
23. while (p!=NULL)
24. {
25. w=p->adjvex; //w为顶点u的相邻点
26. if (w==v && d>0) //找到一个回路,输出之
27. {
28. printf(" ");
29. for (i=0; i<=d; i++)
30. printf("%d ",path[i]);
31. printf("%d \n",v);
32. }
33. if (visited[w]==0) //w未访问,则递归访问之
34. DFSPath(G,w,v,path,d);
35. p=p->nextarc; //找u的下一个邻接顶点
36. }
37. visited[u]=0; //恢复环境:使该顶点可重新使用
38.}
39.
40.void FindCyclePath(ALGraph *G,int k)
41.//输出经过顶点k的所有回路
42.{
43. int path[MAXV],i;
44. for (i=0; i<G->n; i++)
45. visited[i]=0; //访问标志数组初始化
46. printf("经过顶点%d的所有回路\n",k);
47. DFSPath(G,k,k,path,-1);
48. printf("\n");
49.}
50.
51.int main()
52.{
53. ALGraph *G;
54. int A[5][5]=
55. {
56. {0,1,1,0,0},
57. {0,0,1,0,0},
58. {0,0,0,1,1},
59. {0,0,0,0,1},
60. {1,0,0,0,0}
61. }; //请画出对应的有向图
62. ArrayToList(A[0], 5, G);
63. FindCyclePath(G, 0);
64. return 0;
65.}
运行结果:
知识点总结:求通过某点k的所有简单回路。
学习心得:策略是发现下一个为指定点k时再输出。