如何解决以下图形问题

问题陈述

给出N个节点的有向图,其中每个节点都指向N个节点中的任何一个(可能指向自身)。编码员Ishu很无聊,他发现了一个问题,以使自己保持忙碌。问题如下:

如果节点满足以下条件之一,则它是“好”:

  1. 这是特殊节点(标记为节点1)
  2. 它指向特殊节点(节点1)
  3. 它指向一个好的节点。 Ishu将更改某些节点的指针,以使其全部“良好”。您必须找到要更改的最小指针数,以使所有节点均良好(因此,是良好的图形)。

注意:结果图应具有所有节点均良好且每个节点必须精确指向一个节点的属性。

问题约束

1

输入格式

第一个也是唯一的参数是一个整数数组A,它包含N个在1到N之间的数字,其中第i个数字是第i个节点指向的节点数。

输出格式

一个整数,表示最小的指针更改数。

我尝试过的解决方案

我尝试通过反转边缘来构建图形,然后尝试为连接的节点着色,答案将是colors - 1。简而言之,我试图为一个有向图找到连接的组件的数量,这是没有意义的(因为有向图没有任何有关连接组件的概念)。网络上的其他解决方案,例如thisthis也指出要查找连接的组件的数量,但是对于一个有向图来说,连接的组件再次对我来说没有任何意义。对我来说,这个问题比它的初看起来要棘手得多。

iCMS 回答:如何解决以下图形问题

@mcdowella提供了图形的准确表征-在每个连接的组件中,所有指针链都在同一死角或同一循环中向上显示。

但是,如果特殊节点具有非null指针,则会带来麻烦。如果特殊节点具有非空指针,则它可能处于或可能不在其连接组件的终端周期中。首先将特殊节点指针设置为null可以解决此问题,然后:

如果图形具有 m 个连接的组件,则必须更改 m-1 指针以使所有节点均良好。

由于您不必实际更改指针,因此解决该问题所需要做的就是计算图中的连接组件。

有很多方法可以做到这一点。如果您认为边缘是无方向的,则可以使用BFS或DFS来跟踪每个连接的组件。例如,

但是,对于您实际拥有的那种图,每个节点都有一个有向指针,解决此问题的最简单方法是使用不相交的集合数据结构:https://en.wikipedia.org/wiki/Disjoint-set_data_structure

最初,您只是将每个节点放入其自己的集合中,然后将集合合并到每个指针的任一侧,然后通过计算不连续集合结构中的根数来计算集合数。

如果您以前没有实现过不连续的集结构,那么很难理解它是多么容易。这里有几个简单的实现:How to properly implement disjoint set data structure for finding spanning forests in Python?

,

我认为这与Graphic: Rerouting problem test in python language非常相似。因为每个节点仅指向另一个节点,所以您的图形由一组循环组成(将指向自身的节点视为一个循环),并且树向其中馈入。您可以通过跟随节点之间的指针并检查您已访问的节点来找到一个周期。您需要在每个周期中断开一个链接,将其重定向为指向特殊节点。这会将该循环中的所有其他路径以及所有馈入其中的树都路由到特殊节点。

本文链接:https://www.f2er.com/1908912.html

大家都在问