图形算法,为边缘指定正确的方向

时间:2017-11-22 20:23:29

标签: algorithm depth-first-search breadth-first-search undirected-graph

有一个无向图O(V+E),如何为每个边指定一个方向,以便每个顶点在SELECT * FROM (SELECT person.*, CASE WHEN employee.id IS NULL THEN 0 ELSE 1 END AS is_employee, CASE WHEN tenant.id IS NULL THEN 0 ELSE 1 END AS is_tenant FROM person LEFT JOIN employee on person.id = employee.id LEFT JOIN tenant on person.id = tenant.id) AS tA WHERE tA.is_employee <> tA.is_person 时间内最多有一个度? 应该有两个条件:

  

情况1. G没有周期
  我该怎么用? BFS或DFS,以及如何?

     

情况2. G最多有1个周期
  如果有一个循环,我们如何选择指向同一顶点的2条边的方向?

1 个答案:

答案 0 :(得分:1)

对于任何只有一条边附着的顶点,如果你可以完全解决这个拼图,你仍然可以在确定附加到该顶点的唯一边有一个指向该顶点的方向后解决它。

所以我会在每个顶点上使用计数器来跟踪附加到该顶点的边数,并重复设置边缘的方向,这些边的一端在顶点上没有其他附加边,然后删除这些边和它们的顶点从图表中(或将其标记为已删除)并继续。

如果此过程以空图终止,则没有循环,您已解决了问题。

如果它终止于一个或多个循环,其中每个顶点都有两条边连接到它,则选择一条边的方向并沿着循环选择,为您遇到的每条边选择唯一可能的方向。如果有多个循环,则必须多次执行此操作才能为所有剩余边设置方向。

如果这个顶点附有一个多于两条边的顶点,并且每个顶点都附有多条边,那么你就会遇到比周期和路径更复杂的东西,并且无法分配方向以便每个顶点都在 - 学历最多一个。