C++ 求有向图的最大值

C++ 求有向图的最大值,c++,nodes,multimap,directed-graph,edges,C++,Nodes,Multimap,Directed Graph,Edges,我得到了一个不加权的分数。若只沿着边的方向移动,若给我一个顶点,我想知道是否每个其他顶点都可以到达。如果图表是a,这是显而易见的。我对图不完整的情况感兴趣 就实现而言,我将每个连接存储在多映射中。multimap关键边缘尾部multimap值是边缘头部。假设我有以下几对: (1,2) (2,3) (1,4) 在此图中,如果1是给定的节点,则可以直接或间接到达每个节点。如果将另一对添加到多重映射中:(5,3)5将无法从1直接或间接访问,也无法从5访问除3之外的任何节点,因此此图中的任何给定节点

我得到了一个不加权的分数。若只沿着边的方向移动,若给我一个顶点,我想知道是否每个其他顶点都可以到达。如果图表是a,这是显而易见的。我对图不完整的情况感兴趣

就实现而言,我将每个连接存储在
多映射中。
multimap
关键边缘尾部
multimap
值是边缘头部。假设我有以下几对:

  • (1,2)
  • (2,3)
  • (1,4)
在此图中,如果1是给定的节点,则可以直接或间接到达每个节点。如果将另一对添加到
多重映射中
:(5,3)5将无法从1直接或间接访问,也无法从5访问除3之外的任何节点,因此此图中的任何给定节点都无法访问所有其他节点


我的问题是:如果我对这个图所做的只是测试一个节点是否可以到达所有其他节点,那么我是否应该向
multimap
添加边,使所有间接连接都直接连接,然后检查所有节点是否都连接到给定节点?或者有更好的方法来实现这一点吗?

所以您使用多重映射作为邻接列表?您是在问如果两个节点可以相互接触,是否应该在此列表中插入邻接?我强烈反对这种做法。如果以后您想要执行任何图形遍历,那么您的结构将被实际不存在的边污染


如果您真的需要记忆这些信息,请使用一个单独的结构来实现可达性。

那么您使用多重映射作为邻接列表?您是在问如果两个节点可以相互接触,是否应该在此列表中插入邻接?我强烈反对这种做法。如果以后您想要执行任何图形遍历,那么您的结构将被实际不存在的边污染


如果您真的需要记忆这些信息,请使用一个单独的结构来实现可达性。

但是在回答这个问题时,我没有可用的某种遍历功能。我需要找到所有间接连接的节点,看看是否所有的东西都在那里?@JonathanMee:如果你对邻接列表所做的唯一事情就是用它来解决你的可达性问题,那么混合就可以了。事实上,我当时不会称之为邻接列表,而是初始化为邻接列表的可达性列表。@JonathanMee:您需要在图形中的每个顶点执行DFS,并存储到达的节点。也许您正试图用multimap记录以前DFS搜索的结果,以加快搜索速度?我认为最坏情况下的时间复杂度与只对每个顶点单独执行DFS而不缓存结果是一样的。(但在完整图或接近完整图中,记忆可以节省大量处理时间,因为您检查的许多新顶点已经有一个大小为V的邻接列表)我只使用此
多重映射来实现可达性,然后将其丢弃。因此,如果我正确理解您的评论,将
multimap
视为一个“可达性映射”,并用它可以到达的所有可能节点更新每个节点是有意义的。话虽如此,在所讨论的节点上开始做DFS并从那里开始做有意义吗?@JonathanMee:简短回答:是的。详细回答:当您想在任何节点上执行DFS时,事情会变得很奇怪,因为在DFS期间,其可达性列表将发生变化。因此,要解决这个问题,请执行DFS,然后将新到达的节点插入到多重映射中。同样,可能有一个更好的结构。我提到了
std::map
,但我认为
std::map
实际上更合适,因为当您尝试从DFS插入访问的节点时,
set
将处理重复的节点。但是在回答这个问题时,我没有某种遍历功能可用。我需要找到所有间接连接的节点,看看是否所有的东西都在那里?@JonathanMee:如果你对邻接列表所做的唯一事情就是用它来解决你的可达性问题,那么混合就可以了。事实上,我当时不会称之为邻接列表,而是初始化为邻接列表的可达性列表。@JonathanMee:您需要在图形中的每个顶点执行DFS,并存储到达的节点。也许您正试图用multimap记录以前DFS搜索的结果,以加快搜索速度?我认为最坏情况下的时间复杂度与只对每个顶点单独执行DFS而不缓存结果是一样的。(但在完整图或接近完整图中,记忆可以节省大量处理时间,因为您检查的许多新顶点已经有一个大小为V的邻接列表)我只使用此
多重映射来实现可达性,然后将其丢弃。因此,如果我正确理解您的评论,将
multimap
视为一个“可达性映射”,并用它可以到达的所有可能节点更新每个节点是有意义的。话虽如此,在所讨论的节点上开始做DFS并从那里开始做有意义吗?@JonathanMee:简短回答:是的。详细回答:当您想在任何节点上执行DFS时,事情会变得很奇怪,因为在DFS期间,其可达性列表将发生变化。因此,要解决这个问题,请执行DFS,然后将新到达的节点插入到多重映射中。同样,可能有一个更好的结构。我提到了
std::map
,但我认为
std::map
实际上更合适,因为当您尝试从DFS插入访问的节点时,
set
将处理重复的节点。