给定一个代表图节点的N个整数的Arr数组。边在按位与不等于0的那些对之间定义。任务是查找图中是否存在长度为3的循环。
例子:
Input: Arr[] = {26, 33, 35, 40, 50}
Output: Yes
A cycle exists between 26, 33 and 50.
Input: Arrr[] = {17, 142, 243, 300}
Output: No
天真的方法:
运行一个嵌套循环,并检查每对之间是否存在边(如果它们的按位AND值不为零)。因此,我们形成了整个图,并使用任何周期检测方法来检查该图中是否存在周期。
高效方法:
- 通过连接至少3个边来形成一个循环。
- 想法是制作一个二维数组,其中第i行存储Arr [i]的二进制值。
- 接下来,以列方式循环并检查是否存在1的数目至少为3的列。
- 如果是这样,则表明图中存在一个循环。
- 如果不存在这样的列,则表示图中没有循环。
Arr[] = {26, 33, 35, 40, 50}
The 2D array is as following
bi = [
[0 1 0 1 1 0 0 0],
[1 0 0 0 0 1 0 0],
[1 1 0 0 0 1 0 0],
[0 0 0 1 0 1 0 0],
[0 1 0 0 1 1 0 0],
]
bi[0][1], bi[2][1] and bi[4][1] are equal to 1. This implies that bitwise AND value of the following pairs (Arr[0], Arr[2]), (Arr[2], Arr[4]), (Arr[0], Arr[4]) are non-zero. These 3 edges form a cycle.
下面是上述方法的实现:
代码块
Yes
如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。