算法具体原理就不讲了,无非是当要返回到前一个结点时将该结点重新设置为未访问。
void DFS(int start, int end)
{
if (start == end) {
//找到终点
path.push_back(start);//将终点加入path
for (int i = 0; i < path.size(); i++) //输出路径
{
if (i != path.size() - 1)
cout << inverse_maping[path[i]] << "->";
else
cout << inverse_maping[path[i]] << "\n";
}
path.pop_back();//删除最后一个节点
vis[start] = false;//终点重新设置为未访问
return;
}
vis[start] =true; //将当前结点设置为已访问
path.push_back(start);//加入路径
for (int j =0; j < Adj[start].size(); j++) {
//遍历所有子结点
int v = Adj[start][j];//在邻接表中查找子结点v的结点号
if (!vis[v] && path.size()<4) {
//检查该节点是否被访问,
//path.size()<4可以限制输出的最大的路径长度
DFS(v, end); //当前是仅输出起点到终点间的结点数目<=2的路径
}
if (j == Adj[start].size() - 1 ) {
//子结点全部遍历完成
path.pop_back();//删除路径中最后一个节点
vis[start] = false;//设置为未访问
return;
}
}
}
这里给出一个之前实习的问题:
这次疫情湖北受灾严重,那么为什么湖北这么重要,试证明湖北到全国其他省(不包括两个宝岛)中间都不超过2个省。给定图邻接关系city
用DFS求解湖北到其他所有省份的中间不超过2个省的路径并全部输出(例如:湖北-江西-浙江;湖北-陕西-内蒙古-黑龙江)
#include <string>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
using