98.所有可达路径
题目链接 文章讲解
邻接矩阵法
邻接矩阵使用二维数组来表示图结构。邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组
为了节点标号和下标对其,有n个节点的图申请(n + 1) * (n + 1)的空间
vector<vector<int>> graph(n + 1, vector<int>(n + 1, 0));
输入m条边构造图
while (m--) {cin >> s >> t;// 使用邻接矩阵,1表示节点s指向节点t有一条边graph[s][t] = 1;
}
完整代码:
#include <iostream>
#include <vector>using namespace std;void dfs(const vector<vector<int>>& graph, int x, int n);vector<vector<int>> result; // 结果集
vector<int> path; // 当前路径int main() {int N; // 图中有N个节点int M; // 图中有M条边int s, t; // 两个相邻的节点while(cin >> N >> M) {vector<vector<int>> graph(N + 1, vector<int>(N + 1, 0)); // 邻接矩阵存放图while(M--) {cin >> s >> t;graph[s][t] = 1; // 1表示有一条边连接s->t }// 第一个节点加入路径path.push_back(1);dfs(graph, 1, N);if(result.size() == 0) cout << -1 << endl;// 输出结果for(auto path : result) {for(int i = 0; i < path.size() - 1; ++i) {cout << path[i] << " ";}cout << path[path.size() - 1] << endl;}}return 0;
}void dfs(const vector<vector<int>>& graph, int x, int n) {// 遍历到目标节点回收结果if(x == n) {result.push_back(path);return ;}// 遍历图中的每一个节点for(int i = 1; i <= n; ++i) {if(graph[x][i]) { // 当前节点到i节点由路径,将i加入路径path.push_back(i);dfs(graph, i, n); // 进入下一层递归path.pop_back(); // 回溯}}return ;
}
邻接表写法
邻接表使用数组加链表的方式来表示。邻接表是从边的数量来表示图,有多少条边就申请多大的空间
构造邻接表
vector<list<int>> graph(n + 1); // 邻接表,list为链表
输入m条边构造图
while (m--) {cin >> s >> t;// 使用邻接表 ,表示 s -> t 是相连的graph[s].push_back(t);
}
完整代码:
#include <iostream>
#include <vector>
#include <list>using namespace std;void dfs(const vector<list<int>>& graph, int x, int n);vector<vector<int>> result; // 结果集
vector<int> path; // 当前路径int main() {int N; // 图中有N个节点int M; // 图中有M条边int s, t; // 两个相邻的节点while(cin >> N >> M) {vector<list<int>> graph(N + 1); // 邻接矩阵存放图while(M--) {cin >> s >> t;graph[s].push_back(t); // 表示s到t有一条边连接s->t }path.push_back(1);dfs(graph, 1, N);if(result.size() == 0) cout << -1 << endl;for(auto path : result) {for(int i = 0; i < path.size() - 1; ++i) {cout << path[i] << " ";}cout << path[path.size() - 1] << endl;}}return 0;
}void dfs(const vector<list<int>>& graph, int x, int n) {if(x == n) {result.push_back(path);return ;}for(int i : graph[x]) {path.push_back(i);dfs(graph, i, n);path.pop_back();}return ;
}