1971. 寻找图中是否存在路径 - 力扣(LeetCode)
BFS
cpp
class Solution
{
public:
bool validPath(int n, vector<vector<int>> &edges, int source, int destination)
{
vector<vector<int>> adj(n);
for (int i = 0; i < edges.size(); i++)
{
adj[edges[i][0]].push_back(edges[i][1]);
adj[edges[i][1]].push_back(edges[i][0]);
}
queue<int> q;
vector<bool> vis(n, false);
q.push(source);
vis[source] = true;
while (!q.empty())
{
int t = q.front();
q.pop();
if (t == destination)
{
return true;
}
for (int i = 0; i < adj[t].size(); i++)
{
if (!vis[adj[t][i]])
{
vis[adj[t][i]] = true;
q.push(adj[t][i]);
}
}
}
return false;
}
};
DFS
cpp
class Solution
{
vector<vector<int>> adj;
vector<bool> vis;
bool dfs(int source, int destination)
{
if (source == destination)
{
return true;
}
for (int i = 0; i < adj[source].size(); i++)
{
if (!vis[adj[source][i]])
{
vis[adj[source][i]] = true;
if (dfs(adj[source][i], destination))
{
return true;
}
}
}
return false;
}
public:
bool validPath(int n, vector<vector<int>> &edges, int source, int destination)
{
adj.resize(n);
for (int i = 0; i < edges.size(); i++)
{
adj[edges[i][0]].push_back(edges[i][1]);
adj[edges[i][1]].push_back(edges[i][0]);
}
vis.resize(n, false);
vis[source] = true;
return dfs(source, destination);
}
};
841. 钥匙和房间 - 力扣(LeetCode)
BFS
cpp
class Solution
{
public:
bool canVisitAllRooms(vector<vector<int>> &rooms)
{
int n = rooms.size();
vector<bool> vis(n, false);
queue<int> q;
q.push(0);
vis[0] = true;
while (!q.empty())
{
int t = q.front();
q.pop();
for (int i = 0; i < rooms[t].size(); i++)
{
if (!vis[rooms[t][i]])
{
vis[rooms[t][i]] = true;
q.push(rooms[t][i]);
}
}
}
for (int i = 0; i < n; i++)
{
if (vis[i] == false)
{
return false;
}
}
return true;
}
};
DFS
cpp
class Solution
{
vector<bool> vis;
int num = 1;
void dfs(int x, vector<vector<int>> &rooms)
{
for (int i = 0; i < rooms[x].size(); i++)
{
if (!vis[rooms[x][i]])
{
num++;
vis[rooms[x][i]] = true;
dfs(rooms[x][i], rooms);
}
}
}
public:
bool canVisitAllRooms(vector<vector<int>> &rooms)
{
int n = rooms.size();
vis.resize(n, false);
vis[0] = true;
dfs(0, rooms);
return n == num;
}
};
2368. 受限条件下可到达节点的数目 - 力扣(LeetCode)
BFS
cpp
class Solution
{
public:
int reachableNodes(int n, vector<vector<int>> &edges, vector<int> &restricted)
{
vector<vector<int>> adj(n);
for (int i = 0; i < edges.size(); i++)
{
adj[edges[i][0]].push_back(edges[i][1]);
adj[edges[i][1]].push_back(edges[i][0]);
}
int res = 1;
vector<bool> vis(n, false);
for (int i = 0; i < restricted.size(); i++)
{
vis[restricted[i]] = true;
}
queue<int> q;
q.push(0);
vis[0] = true;
while (!q.empty())
{
int t = q.front();
q.pop();
for (int i = 0; i < adj[t].size(); i++)
{
if (!vis[adj[t][i]])
{
res++;
vis[adj[t][i]] = true;
q.push(adj[t][i]);
}
}
}
return res;
}
};