图论第3天----第841题、第463题
# 图论第3天----第841题、第463题
又继续开始修行,把图论这块补上,估计要个5-6天时间。
一、第841题–钥匙和房间
有向图的遍历。dfs遍历3部曲做,思路也较顺----访问过的,就直接返回;没访问过的,就设为true。注意,这里不需要回溯,因为不是找出一条路径来覆盖到所有的节点,而是能覆盖到就行,不要求一条路径来覆盖。
class Solution {
public:
void dfs(vector<vector<int>>& rooms, vector<bool>& visited, int x){
if(visited[x]) return;
visited[x] = true;
for(int t : rooms[x]){
dfs(rooms, visited, t);
}
}
bool canVisitAllRooms(vector<vector<int>>& rooms) {
vector<bool> visited(rooms.size(), false);
dfs(rooms, visited, 0);
for(int i=0; i<rooms.size(); i++){
if(visited[i] == false) return false;
}
return true;
}
};
二、第463题–岛屿的周长
这个题跟dfs三部曲没关系,属于找规律。根据土地的数量、相邻地块的数量,获得最终的结果----num4 - count2;
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[0].size();
int num=0;
int count=0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(grid[i][j] == 1){
num++;
if(i>0 && grid[i-1][j] == 1) count++;
if(j>0 && grid[i][j-1] == 1) count++;
}
}
}
return num*4 - count*2;
}
};