【问题标题】:Convert undirected graph to directed graph with specific condition将无向图转换为具有特定条件的有向图
【发布时间】:2018-12-09 04:33:22
【问题描述】:

给定无向图,它有 M 条边和 N 个顶点,我们必须将每条边从 u-v 转换为 u->v 或 v->u,这样每个顶点的入度都是偶数。哪种方法或算法适合最少的时间复杂性。

【问题讨论】:

  • 您的图表有多大? M和N的极限是多少?我认为这个问题更适合cs.stackexchange.com 此外,如果你能解释你的问题和你的尝试,这将有很大帮助。到目前为止,您似乎只是希望有人为您做作业:) 请编辑此问题并提供更多详细信息。
  • M 和 N 是从 1 到 100,000。我制作了一个邻接列表,它跟踪到达特定顶点的所有边,这意味着如果 1->2,3->2,4->2 则 2 的邻接列表将是 {1,3,4} 所以如果大小邻接列表的每个顶点都是偶数,那么即使使用while循环,我也会知道我制作的每条边的方向,只有当每个顶点都具有偶数时,while循环才会终止。并且每次while循环都会在那些大小奇数的邻接列表中改变方向

标签: algorithm graph graph-theory directed-graph undirected-graph


【解决方案1】:

这是一种不同的方法 - 我认为您不想在 n=100,000 的情况下进行高斯消元,因此我在网络上搜索了相关问题。

如果图有多个连通分量,可以分别考虑,假设它只有一个。

在您的组件上构建一个生成树并将其中一个顶点标记为该树的根。修复边缘的方向,而不是你喜欢的生成树。从叶子开始,一次取一个顶点,在处理该顶点之前处理该顶点的所有子节点。对于每个顶点,选择树边缘到其父节点的方向,以便其自身的度数是偶数,并忽略其父节点的后果。除根外的每个顶点都有一条与父节点相连的边,因此对于除根外的每个顶点,您都可以确保其入度是偶数。

当你来到根时,你没有任何可以改变方向的边,所以你不能改变它的入度,这显然是偶数或奇数。如果它甚至一切都很好 - 每个顶点都有均匀的度数。如果它是奇数,则您有一个顶点的度数为奇数,而所有其他顶点的度数为偶数,因此所有度数的总和为奇数。但是所有入度的总和只是图中的边数,您无法更改。如果图中的边数是奇数,总会有至少一个顶点的度数为奇数,无论如何这个问题是不可能的。

【讨论】:

  • 非常感谢我了解解决方案
【解决方案2】:

你可以这样做 --> 唯一需要做的改变是,在做拓扑之前做 MST

https://www.geeksforgeeks.org/assign-directions-to-edges-so-that-the-directed-graph-remains-acyclic/

【讨论】:

    【解决方案3】:

    给每条边一个任意方向,并创建一个变量(目前未知),说明该边的方向是否需要改变。

    对于每个顶点,一条边根据 x 或 1^x 传入,其中 x 是该边的未知数,1^x 是 1 XOR x = NOT x,具体取决于分配给该边的原始方向是否为是否朝向那个顶点。

    对于每个顶点,即使将这些等式的结果异或的结果为 0,输入边的数量也是如此 - 这与将它们加在一起 ​​mod 2 的结果为 0 相同。

    所以你有一个线性方程组 mod 2,这和二元线性方程组是一样的,你可以使用高斯消元法来看看是否有解。

    (可能有一种更符合图论的方法,但我认为这是一种解决方案)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 2020-02-07
      • 1970-01-01
      相关资源
      最近更新 更多