day-65 代码随想录算法训练营(19)图论 part 04

463.岛屿的周长

分析:
  • 1.陆地的旁边是海面,存在周长
  • 2.陆地在边界上,存在周长
思路一:深度优先遍历
  • 1.通过记录访问情况来访问数据
class Solution {
public:
    int direct[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    int res=0;
    void dfs(vector>&grid,vector>&visted,int x,int y){
        for(int i=0;i<4;i++){
            int nextx=x+direct[i][0];
            int nexty=y+direct[i][1];
            if(nextx>=0 && nextx=0 && nexty>& grid) {
        int n=grid.size(),m=grid[0].size();
        vector>visted(n,vector(m,false));
        for(int i=0;i

1971.寻找图中是否存在路径

分析:
  • 寻找两个节点间是否存在路径,就是寻找两个节点是否在同一集合中
思路一:并查集
  • 1.初始化集合
  • 2.把各个节点进行连接
  • 3.寻根判断
class Solution {
public:
    int n=200005;
    vectorfather=vector(n,0);
    void init(){//并查集初始化
        for(int i=0;i>& edges, int source, int destination) {
        init();
        for(int i=0;i

684.冗余连接

分析:
  • 1.出现两个节点在同一集合,即有冗余
思路一:并查集
  • 1.初始化
  • 2.边添加边判断
class Solution {
public:
    vectorfather=vector(1001,0);
    void init(){
        for(int i=0;i<1001;i++) father[i]=i;
    }
    int find(int u){//寻根
        return u==father[u]?u:father[u]=find(father[u]);
    }
    bool isSame(int u,int v){//判断是否同一集合
        u=find(u);
        v=find(v);
        if(u==0 && v==0) return false;
        return u==v;
    }
    void join(int u,int v){//连接节点
        u=find(u);
        v=find(v);
        if(u==v) return;
        father[u]=v;
    }
    vector findRedundantConnection(vector>& edges) {
        init();//初始化!!!
        int n=edges.size();
        for(int i=0;i();
    }
};

你可能感兴趣的:(#,代码随想录算法训练营(19),深度优先,算法)