【错题集-编程题】城市群数量

简介: 【错题集-编程题】城市群数量

牛客对应题目链接:城市群数量_牛客题霸_牛客网 (nowcoder.com)


一、分析题目

1、并查集


2、dfs(经典 floodfill 算法

使用深度优先搜索(DFS)算法来遍历所有城市,然后统计城市群的数量。


3、bfs经典 floodfill 算法

使用广度优先搜索(BFS)算法来遍历所有城市,然后统计城市群的数量。从一个起始城市开始,将其加入队列,然后依次访问队列中的城市,并将其相连的未访问过的城市加入队列,直到队列为空。


二、代码

1、并查集

class Solution {
public:
    int find(int x, vector<int>& p)
    {
        if(p[x]!=x) p[x]=find(p[x], p);
        return p[x];
    }
    int citys(vector<vector<int> >& m) {
        int n=m.size();
        vector<int> p(n);
        for(int i=0; i<n; i++)
            p[i]=i;
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                if(i!=j && m[i][j]==1)
                    p[find(i, p)]=find(j, p);
        int res=0;
        for(int i=0; i<n; i++)
            if(i==p[i]) res++;
        return res;
    }
};

2、dfs

class Solution {
private:
    bool vis[201]={false};
public:
    void dfs(vector<vector<int> >& m, int i)
    {
        vis[i]=true;
        for(int j=0; j<m[i].size(); j++)
        {
            if(!vis[j] && m[i][j]==1)
                dfs(m, j);
        }
    }
    int citys(vector<vector<int> >& m) {
        int n=m.size();
        int res=0;
        for(int i=0; i<n; i++)
        {
            if(!vis[i])
            {
                res++;
                dfs(m, i);
            }
        }
        return res;
    }
};

3、bfs

class Solution {
private:
    int n;
    queue<int> q;
    bool vis[201]={false};
public:
    void bfs(vector<vector<int>>& m, int st)
    {
        q.push(st);
        vis[st]=true;
        while(q.size())
        {
            int t=q.front();
            q.pop();
            for(int i=0; i<n; i++)
            {
                if(!vis[i] && t!=i && m[t][i]==1)
                {
                    q.push(i);
                    vis[i]=true;
                }
            }
        }
    }
    int citys(vector<vector<int> >& m) {
        n=m.size();
        int res=0;
        for(int i=0; i<n; i++)
        {
            if(!vis[i])
            {
                res++;
                bfs(m, i);
            }
        }
        return res;
    }
};

三、反思与改进

记录一下这道题的多种做法。


相关文章
|
13天前
1036 跟奥巴马一起编程 (15 分)
1036 跟奥巴马一起编程 (15 分)
|
10月前
|
Perl
团体程序设计天梯赛-练习集L1篇③
团体程序设计天梯赛-练习集L1篇③
106 0
|
11月前
|
JavaScript 安全 定位技术
摄影测量学:期末考试重点总结
本文参考《摄影测量学》 (王佩军,徐亚明 编著);
156 0
高职考技能提升教程012期 阶层求和的综合运用
高职考技能提升教程012期 阶层求和的综合运用
|
传感器 存储 监控
电子设计大赛-控制类题目分析
电子设计大赛-控制类题目分析
109 0
电子设计大赛-控制类题目分析
|
算法 C++
蓝桥杯试题 算法训练 绘制地图 C/C++解法 AC(最近,WYF正准备参观他的点卡工厂。WYF集团的经理氰垃圾需要帮助WYF设计参“观”路线。现在,氰垃圾知道一下几件事情。。。。)
蓝桥杯试题 算法训练 绘制地图 C/C++解法 AC(最近,WYF正准备参观他的点卡工厂。WYF集团的经理氰垃圾需要帮助WYF设计参“观”路线。现在,氰垃圾知道一下几件事情。。。。)
87 0
L2-029 特立独行的幸福 (25 分)(数组模拟)
L2-029 特立独行的幸福 (25 分)(数组模拟)
108 0
|
算法 测试技术
h0103. 末日算法 (10 分)
h0103. 末日算法 (10 分)
207 0
|
JavaScript
小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌、打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略。但是小明暂时不关心这一些,
小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌、打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略。但是小明暂时不关心这一些,
296 0
小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌、打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略。但是小明暂时不关心这一些,
|
设计模式 安全 Java
优秀程序员都在注意的十个点
很多事情并不难,只是缺乏多走半里路的习惯!
101 0
优秀程序员都在注意的十个点