【DFS/并查集】see-547. Friend Circles

本文介绍了解决朋友圈好友分组问题的两种算法实现方法。一种是使用并查集思想,通过不断合并好友关系来确定最终的朋友圈数量;另一种是利用深度优先搜索(DFS),遍历好友矩阵来计算独立朋友圈的数量。

解法一:采用并查集的思想,将每一个学生附上相应的标签,若M(i,j)==1,那么按照“靠左”原则,flag[i]==flag[j]==i;

class Solution {
public:
	int get(vector<int> flag, int item)
	{
		if(flag[item]==item)
			return item;
		else
		{
			flag[item]=get(flag,flag[item]);  //更新节点value为最高祖先
			return flag[item];
		}
	}

	void merge(vector<int> &flag,int left,int right)
	{
		int x=get(flag,left);
		int y=get(flag,right);  //获取当前节点的祖先
		if(x!=y)
			flag[y]=x;  //祖先不同,“靠左”原则,更新祖先
	}
	
    int findCircleNum(vector<vector<int>>& M)
     {
    	vector<int> flag(M[0].size());
    	for(int i = 0;i<M[0].size();i++)
    		flag[i] = i;  //初始化各节点的祖先

    	for(int i = 0;i<M[0].size();i++)
    	{
    		for (int j = i+1;j<M[0].size();j++)
    		{
    			if(M[i][j]==1)
    				merge(flag,i,j);
    		}
    	}

    	int ans=0;
    	for(int i=0;i<flag.size();i++)
    		if(flag[i]==i)
    			ans++;

        return ans;
    }
};

解法二:采用DFS的思想,深度优先搜索关联矩阵,计算搜索路径的数目

class Solution {
public:
	void dfs(vector<vector<int>>& M,vector<bool>& visit,int item)
    {
        visit[item]=1;  //开始当前节点的遍历,改为已遍历标记
        for(int i=0;i<M.size();i++)
        {
            if(visit[i]||!M[item][i]) //关联节点已被遍历,或者节点不关联
                continue;
            
            dfs(M,visit,i); //开始遍历关联节点
        }
    }
    int findCircleNum(vector<vector<int>>& M)
     {
    	int ans=0;
        vector<bool> visit(M.size());
        for(int i=0;i<M.size();i++)
        {
            if(!visit[i]) //当前节点未被遍历
            {
                dfs(M,visit,i);
                ans++;
            }
        }
        return ans;
    }
};

 

<?xml version="1.0"?> <launch> <node name="static_path" type="static_path_node" pkg="path_planner" output="screen" respawn="true"> <param name="use_map_topic" value="map" /> <param name="use_cost_map" value="false" /> <param name="map_service" value="map" /> <param name="map_topic" value="map" /> <param name="resolution" value="0.05" /> <!-- forward and backward test --> <!-- <rosparam param="segments">[[1.0], [1.57, 1.0], [-2.0], [-1.5707963, 1.0]]</rosparam> --> <!-- S-curve--> <!-- <rosparam param="segments">[[1.0], [1.57, 1.0], [0.3], [-3.141592, 1.0], [0.7], [3.141592, 1.0], [1.5]]</rosparam> --> <!-- <rosparam param="segments">[[-1.5707963, 2.17] ,[3.85], [-1.5707963, 1.7] ,[0.97], [-1.5707963, 1.7] ,[0.75], [-2.5, 0.7] ,[0.4], [2.5, 0.9] ,[0.2]]</rosparam> --> <!-- xf<rosparam param="segments">[[1.935],[-1.5707963,0.15],[1.83],[-1.5707963,0.15],[1.83],[-1.5707963,0.15],[1.68],[-1.5707963,0.15],[1.68],[-1.5707963,0.15],[1.53],[-1.5707963,0.15],[1.53],[-1.5707963,0.15],[1.38],[-1.5707963,0.15],[1.38],[-1.5707963,0.15],[1.23],[-1.5707963,0.15],[1.23],[-1.5707963,0.15],[1.08],[-1.5707963,0.15],[1.08],[-1.5707963,0.15],[0.93],[-1.5707963,0.15],[0.93],[-1.5707963,0.15],[0.78],[-1.5707963,0.15],[0.78],[-1.5707963,0.15],[0.63],[-1.5707963,0.15],[0.63],[-1.5707963,0.15],[0.48],[-1.5707963,0.15],[0.48],[-1.5707963,0.15],[0.33],[-1.5707963,0.15],[0.33],[-1.5707963,0.15],[0.1]]</rosparam> --> <!-- saolei<rosparam param="segments">[[1.75],[-1.5707963,0.15],[1.7],[-1.5707963,0.15],[1.7],[-1.5707963,0.15],[1.5],[-1.5707963,0.15],[1.5],[-1.5707963,0.15],[1.3],[-1.5707963,0.15],[1.3],[-1.5707963,0.15],[1.1],[-1.5707963,0.15],[1.1],[-1.5707963,0.15],[0.9],[-1.5707963,0.15],[0.9],[-1.5707963,0.15],[0.7],[-1.5707963,0.15],[0.7],[-1.5707963,0.15],[0.5],[-1.5707963,0.15],[0.5],[-1.5707963,0.15],[0.35]]</rosparam> --> <!-- <rosparam param="segments">[[1.5707963,0.15]]</rosparam> --> <!-- ,[1.5707963,0.5],[0.67],[-1.5707963,0.5],[0.1],[-1.5707963,0.5],[1.1],[-1.5707963,0.5],[0.3],[-1.5707963,0.3],[1.5707963,0.25],[2.0] --> <!-- <rosparam param="segments">[[0.6],[-1.0,0.3],[1.0,0.5],[0.2],[1.5707963,0.4],[1.5707963,0.4],[0.2],[-3.1415926,0.4],[0.3],[1.5707963,0.3],[0.2],[1.5707963,0.3],[1.4]]</rosparam> --> <!-- <rosparam param="segments">[[1.75],[-1.5707963,0.15],[1.7],[-1.5707963,0.15],[1.7],[-1.5707963,0.15],[1.5],[-1.5707963,0.15],[1.5],[-1.5707963,0.15],[1.3],[-1.5707963,0.15],[1.3],[-1.5707963,0.15],[1.1],[-1.5707963,0.15],[1.1],[-1.5707963,0.15],[0.9],[-1.5707963,0.15],[0.9],[-1.5707963,0.15],[0.7],[-1.5707963,0.15],[0.7],[-1.5707963,0.15],[0.5],[-1.5707963,0.15],[0.5],[-1.5707963,0.15],[0.35]]</rosparam> --> <!-- xht huixuan--> <!-- <rosparam param="segments">[[8.0], [1.57, 0.2], [8.0], [1.5707963, 0.2],[8.0],[1.57,0.2],[7.0],[1.57,0.2],[7.0],[1.57,0.2],[6.0],[1.57,0.2],[6.0],[1.57,0.2],[5.0],[1.57,0.2],[5.0],[1.57,0.2],[4.0],[1.57,0.2],[4.0],[1.57,0.2],[3.0],[1.57,0.2],[3.0],[1.57,0.2],[2.0],[1.57,0.2],[2.0],[1.57,0.2],[1.0],[1.57,0.2],[1.0]]</rosparam> --> <!-- U-curve --> <!-- <rosparam param="segments">[[4.5], [3.14, 1.0], [-3.14,1.0],[2.0]]</rosparam> --> <!-- xun fei --> <rosparam param="segments">[[1.5707963,0.5],[0.4],[-1.5707963,0.5],[0.05]]</rosparam> <!-- <rosparam param="segments">[[4.5], [3.14, 1.0], [4.0]]</rosparam> --> <!-- typical turning maneuver --> <!-- rosparam param="segments">[[1.57079632679, -1.2], [-1.5707963079632679, 1.2]]</rosparam --> <!-- big path for the meadow behind the Sand building --> <!-- rosparam param="segments">[[25.0],[1.57, 2.0], [15.0], [1.57, 2.0], [25.0], [1.57, 2.0], [15.0], [2.25, 2.0], [28.5], [-2.25, 2.0], [15.0], [-1.5707963, 2.0], [15.0]]</rosparam --> <!-- forward-backward-forward --> <!-- rosparam param="segments">[[1.57079632679, 1.2],[-1.5707963079632679, -1.2], [1.57079632679, -1.2], [-1.5707963079632679, 1.2]]</rosparam --> <!-- circles --> <!-- rosparam param="segments">[[-4.71238898038, 1.0], [4.71238898038, 1.0]]</rosparam --> <!-- lane change --> <!--rosparam param="segments">[[3.5], [1.0471975512, 1.0], [-1.0471975512, 1.0], [3.5]]</rosparam --> <!-- little oval --> <!-- <rosparam param="segments">[[3.141592, 4.0], [4.0], [3.141592, 4.0], [4.0]]</rosparam>--> <!-- 3x little oval --> <!-- rosparam param="segments">[[3.141592, 4.0], [4.0], [3.141592, 4.0], [4.0], [3.141592, 4.0], [4.0], [3.141592, 4.0], [4.0], [3.141592, 4.0], [4.0], [3.141592, 4.0], [4.0]]</rosparam --> <!-- left-right-left --> <!-- rosparam param="segments">[[2.0], [1.57079632679, 1.2],[-3.141592, 1.2], [3.141592], [3.141592, 1.2], [-1.5707963079632679, 1.2], [2.0]]</rosparam --> <!-- straight line forward --> <!-- rosparam param="segments">[[15.0]]</rosparam --> <!-- straight line backward --> <!-- rosparam param="segments">[[-5.0]]</rosparam --> <!-- figure eight five times --> <!-- rosparam param="segments">[[6.28318530718, 1.5],[-6.28318530718, 1.5],[6.28318530718, 1.5],[-6.28318530718, 1.5],[6.28318530718, 1.5],[-6.28318530718, 1.5],[6.28318530718, 1.5],[-6.28318530718, 1.5],[-6.28318530718, 1.5],[-6.28318530718, 1.5]]</rosparam --> <!-- semicircle forward --> <!-- rosparam param="segments">[[3.14, 0.8]]</rosparam --> <!-- circle backward --> <!-- rosparam param="segments">[[5.0, -1.0]]</rosparam --> </node> </launch> 如何在CPP文件设置<rosparam param="segments">[[1.5707963,0.5],[0.4],[-1.5707963,0.5],[0.05]]</rosparam>这个参数
最新发布
07-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值