我的算法不正确。为什么这样?

时间:2016-04-27 10:36:39

标签: python algorithm

我正在尝试解决the following problem

  

这群人由N名成员组成。每个成员在该组中都有一个或多个朋友。您要编写将该组划分为两个团队的程序。每个团队的每个成员都必须在另一个团队中有朋友。

     

输入:   第一行输入包含唯一的数字N(N≤100)。成员从1到N编号。第二,第三,......和第(N + 1)行分别包含第一,第二,......和第N个成员的朋友列表。此列表以零结束。请记住,这个群体中的友谊永远是相互的。

     

输出:   第一行输出应包含第一组中的人数,如果不可能将人员划分为两个队,则为零。如果解决方案存在,则应将第一组的列表写入第二行输出。数字应按单个空格划分。如果有多个解决方案,您可以找到其中任何一个。

我的算法如下所示:

create a dictionary where each player maps to a list of friends

team1 = ['1']
team2 = []

left = []

for player in dictionary:
    if its friend in team1:
        add to team2
    elif its freind in team2:
        add to team1
    else:
        add it to left

但它仍然不正确。字典中可能有循环,其中6的朋友是7,而7的唯一朋友是6.在这种情况下我该怎么办?我不知道这样的循环可能有多长。我该怎么办。因为,我的代码周围有一个while循环,我目前正在进入一个无限循环。我也试图将left的玩家添加到团队中,但由于他们之间存在周期,因此无法正常工作。我不知道如何解决以下问题。

感谢。

2 个答案:

答案 0 :(得分:2)

由于这是一个竞争问题,很明显你想从中学习,我对细节有点疏忽,并解释我对这个问题的看法。

首先,考虑连接的友谊组件,然后选择任何顶点。由于友谊关系是可交换的,因此很容易看出添加边缘意味着两个顶点都被解决了#34;。这似乎暗示了找到perfect matching

然而,找到完美匹配是不够的,对于具有三个顶点的完整图形,不存在完美匹配,但它可以被解决。所以考虑一下,似乎Hamiltonian path就足够了,因为你可以只交替团队。

如果你考虑一棵足够大的树,那么应该很清楚,没有汉密尔顿路径,但是明显将球队分成偶数或奇数高度会产生正确的结果。所以答案似乎是,如果你能找到一棵生成树,那么这棵树可以用来将团队分成两部分。

这可以针对每个组件重复进行,只是玩图表,它应该足够令人信服,因为每个组件都有一个生成树,所以没有其他地方可以扩展到。我不确定什么是没有可能分配的图表。也许如果你有一个未连接的节点,那被认为是无效的?

答案 1 :(得分:1)

更新:我发现更简单的解决方案。最初的答案在底部。这个更干净,并带有证据;)

我们将逐步构建解决方案。最初的状态是所有人都是未分配的,两个团队都是空的。我们将使用以下两个操作之一扩展解决方案。在每一步之后,该部门将是合法的,这意味着每个分配的人都将有一个朋友分配给另一个团队。

行动1:挑选任何两个未分配的朋友。把他们中的一个放在A队,另一个放在B队。不变量持有,因为新分配的人彼此了解并且在不同的团队中。

行动2:选择任何拥有分配好友的人,并将他放在另一个团队中。不变量成立,因为分配的人就是以满足它的方式分配的。

所以在步骤中你选择任何可行动作并执行它。重复,直到没有更多可能的操作。这是什么时候发生的?这意味着没有一个未分配的人有任何朋友。由于我们假设每个人都至少有一个朋友,所以你可以执行这些操作,直到没有人离开。

原始回答:

这个问题起初似乎很复杂,但事实上并不需要火箭科学。对分工的限制相当宽松 - 每个人只需要另一个团队中的一个朋友。

首先考虑一个更简单的案例。假设您有两队人员和一名额外参加派对的球员,需要分配到两支现有球队之一。如果他根本没有朋友,那是不可能的。但是,如果他确实有任何朋友,你可以选择他的一个朋友并将新人分配到另一个团队。

结果如何?如果你可以从一些小团队开始,然后安排其他人,让他们总是认识一个以前来过的人,你就是金色的。这意味着我们将最初的大问题减少到两个较小的问题。

解决第一个问题很容易。为了引导团队,只需挑选任何两个相互认识的人,将其中一个放入A队,另一个放入B队,然后就可以了。

现在,第二个:加上其他人。看看已经分配给团队的所有人,看他们是否有任何未分配的朋友。案例1:已经分配的一个人有一个未分配的朋友。你可以轻松地将他添加到某个地方。案例2:所分配人员的所有朋友也已经分配。这意味着最初的友谊图没有连接,也没有任何伤害 - 只需随机取出未分配的人并将他放在任何地方。

相关问题