欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 搜索与图论:所有可达路径(DFS算法)

搜索与图论:所有可达路径(DFS算法)

2024/10/25 1:27:51 来源:https://blog.csdn.net/weixin_43790371/article/details/139636096  浏览:    关键词:搜索与图论:所有可达路径(DFS算法)

搜索与图论:所有可达路径(DFS算法)

    • 题目描述
    • 参考代码
      • 邻接表方法
      • 邻接矩阵方法

题目描述

题目描述
给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。
输入描述
第一行包含两个整数 N,M,表示图中拥有 N 个节点,M 条边

后续 M 行,每行包含两个整数 s 和 t,表示图中的 s 节点与 t 节点中有一条路径

输出描述
输出所有的可达路径,路径中所有节点之间空格隔开,每条路径独占一行,存在多条路径,路径输出的顺序可任意。如果不存在任何一条路径,则输出 -1。

注意输出的序列中,最后一个节点后面没有空格! 例如正确的答案是 1 3 5,而不是 1 3 5 , 5后面没有空格!

输入示例

5 5
1 3
3 5
1 2
2 4
4 5

输出示例

1 3 5
1 2 4 5

参考代码

邻接表方法

#include <iostream>
#include <cstring>
#include <vector>using namespace std;const int N = 510;      // 边数int n, m;
int h[N], e[N], ne[N], idx;
vector<int> path;
bool flag;              // 用于标记是否存在路径void add(int a, int b)
{e[idx] = b; ne[idx] = h[a]; h[a] = idx; idx++;
}void dfs(int u)
{// 如果到达了终点,输出完整路径if (u == n){int len = path.size();  // 路径的长度for (int i = 0; i < len - 1; i++) printf("%d ", path[i]);printf("%d\n", path[len - 1]);flag = true;}// 如果没有到达终点,继续深搜,遍历该点的所有邻边for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];       // 邻边的终点path.push_back(j);  // 将下一个点加入路径dfs(j);             // 递归深搜path.pop_back();    // 弹出该邻边的终点,继续遍历下一个邻边}
}int main()
{memset(h, -1, sizeof h);scanf("%d%d", &n, &m);while (m -- ){int a, b;scanf("%d%d", &a, &b);add(a, b);}path.push_back(1);      // 先加入起点dfs(1);                 // 从起点开始深搜if (!flag) puts("-1");return 0;
}

邻接矩阵方法

#include <iostream>
#include <cstring>
#include <vector>using namespace std;const int N = 110;int n, m;
int g[N][N];
bool flag;
vector<int> path;void dfs(int u)
{// 如果到达了终点,输出完整路径if (u == n){int len = path.size();  // 路径的长度for (int i = 0; i < len - 1; i++) printf("%d ", path[i]);printf("%d\n", path[len - 1]);flag = true;}// 如果没有到达终点,继续深搜,遍历该点的所有邻边for (int i = 1; i <= n; i++){if (g[u][i] == 1){path.push_back(i);  // 将下一个点加入路径dfs(i);             // 递归深搜path.pop_back();    // 弹出该邻边的终点,继续遍历下一个邻边}}
}int main()
{scanf("%d%d", &n, &m);while (m -- ){int a, b;scanf("%d%d", &a, &b);g[a][b] = 1;                // 值为1代表右边,0代表无边}path.push_back(1);      // 先加入起点dfs(1);                 // 从起点开始深搜if (!flag) puts("-1");return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com