栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

第15题:省份数量

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第15题:省份数量

解题思路:运用并查集,当城市之间有路径时,合并不同省份的城市,当没有路径时,什么也不做。并且,运用按秩合并的方法防止树退化成线性表,即总是让秩较小的根节点插入到秩较大的根节点处。

源代码:

class Solution {

public:

    int findCircleNum(vector>& isConnected) {

int n=isConnected.size();

        int ans=n;//初始,所有城市均在不同省份

        vector parents(n,-1);

        vector rank(n,0);

        for(int i=0;i

            for(int j=i+1;j

                if(isConnected[i][j]==1&&UnionSet(i,j,parents,rank)){ //发现两城市属于同一省份,ans--

                    ans--;

                }

            }

        }

        return ans;

    }

    int FindRoot(const vector &parents,int i){

        if(parents[i]==-1) return i;

        return FindRoot(parents,parents[i]);

    }

    bool UnionSet(int a,int b,vector &parents,vector &rank){

        int root_a=FindRoot(parents,a);

        int root_b=FindRoot(parents,b);

        if(root_a==root_b) return false;

        if(rank[root_a]>rank[root_b]) parents[root_b]=root_a;

        else if(rank[root_b]>rank[root_a]) parents[root_a]=root_b;

        else{

            parents[root_b]=root_a;

            rank[root_a]++;

        }

        return true;

    }

};

运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/513134.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号