接下来进入图论环节。需要掌握一定图论基础,有向无向,连接矩阵等。
题1:
指路:98. 所有可达路径 (kamacoder.com)
思路与代码:
1.邻接矩阵
本题我们尝试用深搜解决。首先确定递归函数及参数,定义一个dfs函数和变量x,分别用来遍历图和节点。将终点设为n,当x==n时表示遍历到了终点,发现了一条路径,那么这就是终止条件。其次需要处理从目前搜索节点i出发的路径,将遍历到的节点加入到路径,随后遍历下一个节点,最后回溯处理本次添加的节点。代码如下:
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>> result; // 收集符合条件的路径
vector<int> path; // 1节点到终点的路径void dfs (const vector<vector<int>>& graph, int x, int n) {// 当前遍历到的节点x,到达节点nif (x == n) { // 找到了符合条件的路径result.push_back(path); // 入结果集return ;}for (int i = 1; i <= n; i++) {if (graph[x][i] == 1) { // 找到x连接的节点path.push_back(i); // 遍历到的节点加入到路径dfs(graph, i, n); // 进入下一层递归path.pop_back(); // 回溯,弹出已有路径}}
}//
int main() {int n, m, s, t;cin >> n >> m;vector<vector<int>> graph(n + 1, vector<int> (n + 1, 0));while (m--) {cin >> s >> t;graph[s][t] = 1; // }path.push_back(1); // 从0出发dfs(graph, 1, n); // 开始遍历//if (result.size() == 0) cout << -1 << endl;for (const vector<int>& pa : result) {for (int i = 0; i < pa.size() - 1; i++) {cout << pa[i] << " ";}cout << pa[pa.size() - 1] << endl;}
}