• 2 找出从指定结点出发且长度为m的所有简单路径---来源舒姐


    下面是舒姐的csdn

    abyssfall的博客_CSDN博客-计科学子的头发账本,代码存档领域博主

    在使用图的邻接表ADT的基础上,设计一个算法,按照深度优先搜索的思想找出从指定结点出发且长度为m的所有简单路径。并将此算法加入到邻接表ADT中,在邻接表ADT中提供一个公有的成员函数FindPath(start, m)。

    提示:

    (1)这个问题相当于从指定结点开始深度优先遍历,而且遍历的深度正好为m。为此,在遍历时需要记住遍历的深度,当深度达到m时,就不需要递归了。此时需要输出这条路径,因此在遍历的过程中还需要记住整条路径。

    (2)由于深度优先遍历是用递归实现的,所以FindPath函数最好也设计两个。一个是共有的FindPath函数,供用户使用(外壳);另一个是私有的FindPath函数,实现递归的遍历。公有的FingPath函数调用私有的FindPath函数找出这些路径。

    (3)在调用递归的FindPath函数前,外壳函数还需要做一些辅助工作:

    1)要找的是长度为m的简单路径,因此路径上不能有相同的结点,于是定义了一个数组visited记录结点是否在路径上。

    2)当路径长度等于m时要输出这条路径,于是定义了一个数组stack保存这条路径。每访问一个结点,都要把结点记录在stack中。

    3)递归的FindPath函数有6个参数。第1个参数是遍历的起点的序号;第2个参数是要求的路径长度;第3个参数是符合要求的路径数目;第4个参数是当前路径中的结点数,当前路径的长度是结点数减1;第5个参数是visited数组,记录结点是否在路径上;第6个参数是一个用于记录路径上结点序号的数组,作用和栈类似。

    4)调用FindPath函数时要指出从哪一个结点出发,而递归的FingPath函数的参数是起点的序号。递归的FindPath函数首先将起点放入这条路径,并标记这个结点已被访问,然后判断路径长度是否是m。如果长度已达到m,则输出这条路径,并将最后一个结点从路径上删除,返回上一层调用,检查是否还有其它的途径;否则逐个检查起点的后继结点。如果该后继结点没有被访问过,则对该结点调用递归的FindPath函数继续寻找。在所有的后继都检查后,表示这条路径处理完毕。将起始结点从这条路径上删除,返回上一层调用。

    参考函数原型:

    (1)//找出从指定结点出发且长度为m的所有简单路径(外壳部分) 

    template

    void adjlist_graph::FindPath(int start, int m);

    (2)//找出从指定结点出发且长度为m的所有简单路径(递归部分) 

    template

    void adjlist_graph::FindPath(int start, int m, int &count, int top, int visited[], int stack[]);

    输入说明 :

    第一行:图的类型

    第二行:结点数

    第三行:结点集

    第四行:边数

    第五行:边集

    第六行:起点start

    第七行:路径长度m

    输出说明 :

    第一行:顶点集

    第二行:邻接表

    空行

    如无符合要求的路径:输出 0

    否则: 路径输出(一条路径占一行)

               路径数目

    输入范例 :

    DG
    8
    1 2 3 4 5 6 7 8
    8
    0 1
    0 2
    1 3
    1 4
    2 5
    2 6
    3 7
    4 7
    0
    2

    输出范例 :

    1 2 3 4 5 6 7 8
    1->2->1
    2->4->3
    3->6->5
    4->7
    5->7
    6
    7
    8

    1->3->7
    1->3->6
    1->2->5
    1->2->4
    4

    1. #include
    2. using namespace std;
    3. const int MAX = 100;
    4. int m = 0;
    5. int arr[MAX][2] = {0};
    6. struct E
    7. {
    8. int num;
    9. E *next = NULL;
    10. };
    11. struct V
    12. {
    13. string data;
    14. E *next = NULL;
    15. };
    16. struct graph
    17. {
    18. V m[MAX];
    19. int number_of_V;
    20. int number_of_E;
    21. };
    22. void creat_no_directioin(graph &g)
    23. {
    24. int v;
    25. int f;
    26. cin >> v;
    27. g.number_of_V = v;
    28. for (int i = 0; i < v; i++)
    29. {
    30. cin >> g.m[i].data;
    31. }
    32. //输入顶点字母
    33. cin >> f;
    34. g.number_of_E = f;
    35. for (int i = 0; i < f; i++)
    36. {
    37. int v1, v2;
    38. cin >> v1 >> v2;
    39. arr[i][0] = v1;
    40. arr[i][1] = v2;
    41. E *p1 = new E;
    42. p1->num = v2;
    43. p1->next = g.m[v1].next;
    44. g.m[v1].next = p1;
    45. E *p2 = new E;
    46. p2->num = v1;
    47. p2->next = g.m[v2].next;
    48. g.m[v2].next = p2;
    49. }
    50. }
    51. void creat_direction(graph &g)
    52. {
    53. int e;
    54. int f;
    55. cin >> e;
    56. g.number_of_V = e;
    57. for (int i = 0; i < e; i++)
    58. {
    59. cin >> g.m[i].data;
    60. }
    61. cin >> f;
    62. g.number_of_E = f;
    63. for (int i = 0; i < f; i++)
    64. {
    65. int v1, v2;
    66. cin >> v1 >> v2;
    67. arr[i][0] = v1;
    68. arr[i][1] = v2;
    69. E *p1 = new E;
    70. p1->num = v2;
    71. p1->next = g.m[v1].next;
    72. g.m[v1].next = p1;
    73. }
    74. }
    75. bool index0[MAX] = {false};
    76. vector path; //栈,记录当前路径上的结点
    77. int now_path = 0; //记录总路径数目
    78. void DFS(graph &g, int am, int len, int now_len)
    79. {
    80. index0[am] = true; //标记该点已入选
    81. path.push_back(g.m[am]);
    82. if (now_len == len)
    83. {
    84. bool f = false;
    85. for (int i = 0; i <= len; i++)
    86. {
    87. if (f == true)
    88. {
    89. cout << "->";
    90. }
    91. else
    92. {
    93. f = true;
    94. }
    95. cout << path[i].data;
    96. }
    97. now_path++;
    98. cout << endl;
    99. }
    100. else
    101. {
    102. E *p = g.m[am].next;
    103. while (p && now_len < len) //未达目标长度、且还有下个结点
    104. {
    105. if (index0[p->num] == 0)
    106. {
    107. DFS(g, p->num, len, now_len + 1);
    108. }
    109. p = p->next;
    110. }
    111. }
    112. path.pop_back();
    113. index0[am] = false;
    114. }
    115. int main()
    116. {
    117. string kind;
    118. cin >> kind;
    119. if (kind == "DG")
    120. {
    121. // cout << "DG" << endl;
    122. graph g;
    123. creat_direction(g);
    124. int m = 0;
    125. for (int h = 0; h < g.number_of_V; h++)
    126. {
    127. if (m == 1)
    128. {
    129. cout << " ";
    130. }
    131. m = 1;
    132. cout << g.m[h].data;
    133. }
    134. cout << endl;
    135. for (int u = 0; u < g.number_of_V; u++)
    136. {
    137. cout << g.m[u].data;
    138. E *p = g.m[u].next;
    139. while (p)
    140. {
    141. cout << "->";
    142. cout << p->num;
    143. p = p->next;
    144. }
    145. if (p == NULL)
    146. {
    147. cout << endl;
    148. }
    149. }
    150. cout << endl;
    151. int num, len;
    152. cin >> num >> len;
    153. DFS(g, num, len, 0);
    154. cout << now_path;
    155. }
    156. else if (kind == "UDG")
    157. {
    158. // cout << "UDG" << endl;
    159. graph g;
    160. creat_no_directioin(g);
    161. for (int h = 0; h < g.number_of_V; h++)
    162. {
    163. if (m == 1)
    164. {
    165. cout << " ";
    166. }
    167. m = 1;
    168. cout << g.m[h].data;
    169. }
    170. cout << endl;
    171. for (int u = 0; u < g.number_of_V; u++)
    172. {
    173. cout << g.m[u].data;
    174. E *p = g.m[u].next;
    175. while (p)
    176. {
    177. cout << "->" << p->num;
    178. p = p->next;
    179. }
    180. if (p == NULL)
    181. {
    182. cout << endl;
    183. }
    184. }
    185. cout << endl;
    186. int num, len;
    187. cin >> num >> len;
    188. DFS(g, num, len, 0);
    189. cout << now_path;
    190. }
    191. getchar();
    192. getchar();
    193. return 0;
    194. }

  • 相关阅读:
    Redis笔记
    2024年MathorCup数学建模思路D题思路分享
    DDR时序
    深度学习环境 | pycharm+cuda+pytorch
    使用阿里云OSS实现视频上传功能
    06-Redis缓存高可用集群
    【C#项目实战】控制台游戏勇士斗恶龙(1)——游戏初始设置以及开始界面
    npm包管理相关命令
    java spring cloud 企业工程管理系统源码+二次开发+定制化服务
    CSS 模糊效果 CSS 黑白效果 CSS调整亮度 对比度 饱和度 模糊效果 黑白效果反转颜色
  • 原文地址:https://blog.csdn.net/Ultravioletrays/article/details/126799695