题目来源:105. 有向图的完全可达性
C++题解1:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int N, K;
cin>>N>>K;
// 如果边的数量不够,则一定不能到达所有点
if(N-2 >= K) {cout<<-1; return 0;}
// path存放路径,visited标记是否能到达
vector<vector<int>> path(K, vector<int>(2, 0));
for(int i = 0; i < K; i++){
cin>>path[i][0]>>path[i][1];
}
vector<bool> visited(N, false);
visited[0] = true;
// 二维数组sort排序第一个,这样路径就是从小往大排的。
// 比如遍历完1能到达的地方,下一个是看2能不能到达,而不会看3,把2跳过
sort(path.begin(), path.end());
for(int i = 0; i < K; i++) {
// 只有第一个值能到达,路径的第二个才能到达
if(visited[ path[i][0] - 1 ]) visited[path[i][1]-1] = true;
}
// 判断是否有没有到达的地方
if(find(visited.begin(), visited.end(), false) == visited.end()) cout<<1;
else cout<<-1;
return 0;
}
C++题解2:深度优先。使用list<int>存储。来源代码随想录
// 写法一:dfs 处理当前访问的节点
#include <iostream>
#include <vector>
#include <list>
using namespace std;
void dfs(const 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, m, s, t;
cin >> n >> m;
// 节点编号从1到n,所以申请 n+1 这么大的数组
vector<list<int>> graph(n + 1); // 邻接表
while (m--) {
cin >> s >> t;
// 使用邻接表 ,表示 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;
}
C++题解3:广度优先。来源代码随想录
#include <iostream>
#include <vector>
#include <list>
#include <queue>
using namespace std;
int main() {
int n, m, s, t;
cin >> n >> m;
vector<list<int>> graph(n + 1);
while (m--) {
cin >> s >> t;
graph[s].push_back(t);
}
vector<bool> visited(n + 1, false);
visited[1] = true; // 1 号房间开始
queue<int> que;
que.push(1); // 1 号房间开始
// 广度优先搜索的过程
while (!que.empty()) {
int key = que.front(); que.pop();
list<int> keys = graph[key];
for (int key : keys) {
if (!visited[key]) {
que.push(key);
visited[key] = true;
}
}
}
for (int i = 1; i <= n; i++) {
if (visited[i] == false) {
cout << -1 << endl;
return 0;
}
}
cout << 1 << endl;
}