思路:
由于输入是边的形式。所以用到了邻接表。
为什么本题就没有回溯呢?
代码中可以看到dfs函数下面并没有回溯的操作。
此时就要在思考本题的要求了,本题是需要判断 1节点 是否能到所有节点,那么我们就没有必要回溯去撤销操作了,只要遍历过的节点一律都标记上。
那什么时候需要回溯操作呢?
当我们需要搜索一条可行路径的时候,就需要回溯操作了,因为没有回溯,就没法“调头”。
储备:
题目输入用到了邻接表。又用到了list。和vector有点像,都是push_back,pop_back。一个是动态数组,一个是动态链表。
vector与list的区别_vector[] 和list <vector>的区别-优快云博客
list与vector的区别_list和vector的区别-优快云博客
操作:
问题重点:
最后:
#include<bits/stdc++.h>
using namespace std;
void dfs(vector<list<int>>& g,int s,vector<bool>& vst) {
// list<int> t=g[s];//取出它的所有邻点
// for (int i:t)
for (int i:g[s]) {//对list里的每个邻点
if (vst[i]==false) {//如果没见过的话
vst[i]=true;
dfs(g,i,vst);
}
}
}
int main()
{
int n,m,s,t;
cin>>n>>m;
vector<list<int>> g(n+1);//邻接表
while (m--) {
cin>>s>>t;
g[s].push_back(t);
}
vector<bool> vst(n+1,false);
vst[1]=true;
dfs(g,1,vst);
for (int i=1;i<=n;i++) {
if (vst[i]==false) {
cout<<-1<<endl;
return 0;
}
}
cout<<1<<endl;
return 0;
}


被折叠的 条评论
为什么被折叠?



