本文最后更新于583 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
1.本题在代码随想录上给出的思路很清晰,其中有一个处理的到底是当前节点还是下一个节点的问题值得深思一下,我想来我一直使用的都是处理当前节点的思路所以本题我就还是使用这个思路,而且还有一个问题就是什么时候要回溯节点,文中给出的想法是当我们需要求解一条路径的时候,回溯是为了可以让这个路径掉头。
引用代码随想录:看上面两个版本的写法中, 好像没有发现回溯的逻辑。
我们都知道,有递归就有回溯,回溯就在递归函数的下面, 那么之前我们做的dfs题目,都需要回溯操作,例如:0098.所有可达路径, 为什么本题就没有回溯呢?
代码中可以看到dfs函数下面并没有回溯的操作。
此时就要在思考本题的要求了,本题是需要判断 1节点 是否能到所有节点,那么我们就没有必要回溯去撤销操作了,只要遍历过的节点一律都标记上。
那什么时候需要回溯操作呢?
当我们需要搜索一条可行路径的时候,就需要回溯操作了,因为没有回溯,就没法“调头”, 如果不理解的话,去看我写的 0098.所有可达路径 的题解。
CPP
#include<bits/stdc++.h>
using namespace std;
void dfs(vector<list<int>>& graph, int key, vector<bool>& visited){
if(visited[key])return ;
visited[key] = true;
list<int> keys = graph[key];
for(int key : keys){
dfs(graph, key, visited);
}
}
int main(){
int n, k, s, t;
cin >> n >> k;
vector<list<int>> graph(n + 1);
while(k--){
cin >> s >> t;
graph[s].push_back(t);
}
vector<bool> visited(n + 1, false);
dfs(graph, 1, visited);
for(int i = 1; i <= n; i++){
if(visited[i] == false){
cout << -1 << endl;
return 0;
}
}
cout << 1 << endl;
}