我最近开始研究图表及其不同的遍历算法,似乎无法想出这个问题的答案。我真的需要你的帮助,我甚至不知道从哪里开始。 附:这是我昨天的生日,因为这个问题,我不想哭。
纽约的一家公司生产用于汽车的蓝色卤素灯泡。不幸的是,一直很难对灯泡进行着色。当然,将成对的灯泡包装起来也是非常重要的。为了成对包装灯泡,从装配线出来的灯泡首先被分成两组具有相似颜色的灯泡(例如,一组较暗的灯泡,另一组较轻的灯泡),然后在每组中形成对。 / em>的
由于需求增加,该公司希望雇用更多工人将灯泡分成两组。为了确定申请人是否具备执行这项相当微妙的任务的适当技能,他们被要求采取这个简单的测试:给定一组nn灯泡,比较每对灯泡并确定两个灯泡是否具有“相似”或“不同”的颜色。申请人还可以选择对每对说“不确定”。公司希望雇用一致判断的申请人。我们说m判断(导致“相似”或“不同”)是一致的,如果有可能将n个灯泡分成两组,使得(i)每对{a,b}被确定为“相似”,a和b确实属于同一组,并且(ii)对于每一对{a,b}被确定为“不同”,a和b确实属于不同的集合。
对于具有m个判断的n个灯泡的给定测试结果,设计O(n + m)时间算法以确定判断是否一致。在实践中,申请人应该做出最少数量的判断,但是你的算法应该适用于m≥0的任何整数。
非常感谢你!
答案 0 :(得分:1)
我会这样做:
为每个灯泡创建一个带顶点的图形。当它们被判断为相同时,用红色边缘连接顶点,如果判断它们是不同的,则用蓝色边缘连接。
使用DFS,BFS或其他方法将图形划分为由红色边连接的顶点集。
检查每个红色连接组件中是否有蓝色边缘。如果是这样,则判断不一致。
将每个红色连接的组件折叠为单个顶点。这将删除图表中的所有红色边缘。由于(3),它不会删除任何蓝色边缘。此操作反映了以下限制:当您将灯泡分成两组时,每个红色连接组件中的所有灯泡必须放在同一组中。
检查结果图是否为二分图。如果是这样,那么您可以一致地划分图形。否则你不能。
如果做得正确,每个步骤都适合O(n + m)时间。