朋友圈问题

1.朋友圈问题

有 N 个同学,他们之间有些是朋友,有些不是,"友谊"是可以传递的,例如 A 与 B 是朋友, B 与 C 是朋友,那么 A 与 C 也是朋友,朋友圈就是完成"友谊"传递后的一组朋友。给定 N * N 的矩阵代表同学间是否是朋友,如果 M[i] [j]=1代表第 i 个学生与第 j 个学生是朋友,否则不是,求朋友圈的个数。

思路:从第一个顶点开始访问。如果能遍历完所有的顶点就代表所有顶点是一个朋友圈,如果不能遍历完,那么就从其余顶点重新开始遍历

//朋友圈问题
void DFS(int k, int num[3][3], int visited[3])
{
	visited[k] = 1;//代表当前顶点此时开始被访问
	for (int i = 0; i < 3; i++)
	{
		if (visited[i] == 0 && num[k][i] == 1)//如果i还没有被访问,且k和i是朋友
			DFS(i, num, visited);//递归调DFS
	}
}
void main()
{
	//int num[3][3] = { {1,1,0},{1,1,1},{0,1,1} };//1
	int num[3][3] = { {1,1,0},{1,1,0},{0,0,1} };//2
	int visited[3] = { 0 };//初始化为0,代表还没有被访问
	int count = 0;//记录朋友圈个数
	for (int i = 0; i < 3; i++)
	{
		if (visited[i] == 0)//还没有被访问
		{
			DFS(i, num, visited);//结束一次这个调用,就是一个朋友圈
			count++;
		}
	}
	cout << "朋友圈个数是:" << count << endl;
}

截图:

猜你喜欢

转载自blog.csdn.net/weixin_62456756/article/details/129130748