Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的算法不是';不正确。为什么会这样?_Python_Algorithm - Fatal编程技术网

Python 我的算法不是';不正确。为什么会这样?

Python 我的算法不是';不正确。为什么会这样?,python,algorithm,Python,Algorithm,我试图解决: 这组人由N名成员组成。每个成员在组中都有一个或多个朋友。你要写一个程序,把这个小组分成两个小组。每个团队的每个成员都必须在另一个团队中有朋友 输入: 输入的第一行只包含数字N(N≤ 100). 成员的编号从1到N。第二行、第三行……和第(N+1)行分别包含第一、第二……和第N个成员的朋友列表。此列表以零结尾。记住,在这个群体中,友谊总是相互的 输出: 输出的第一行应该包含第一个团队中的人数,如果无法将人员分成两个团队,则为零。如果解决方案存在,则应将第一组的列表写入第二行输出。数字

我试图解决:

这组人由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循环,所以我现在运行的是一个无限循环。我还尝试将
左侧的玩家添加到团队中,但由于他们之间存在循环,因此无法工作。我不知道如何解决下面的问题


谢谢。

因为这是一个竞争问题,而且很明显你想从中学习,所以我将对细节略作说明,并进一步解释我是如何看待这个问题的

首先,考虑一个连接的友情组件,然后选择任何顶点。由于友谊关系是可交换的,很容易看出添加边意味着两个顶点都“已解决”。这似乎意味着要找一个合适的工作

然而,仅仅找到一个完美匹配是不够的,对于具有三个顶点的完全图,完美匹配是不存在的,但它是可以解决的。所以再仔细考虑一下,a就足够了,因为你可以选择其他球队

如果你考虑一棵足够大的树,很明显,没有哈密顿路径,但是通过奇数或奇数的高度明显的分裂会产生正确的结果。所以答案似乎是,如果你能找到一棵生成树,那棵树可以用来把团队分成两部分


这可以在每个组件上重复,只是在玩图形,这对于竞争来说应该足够有说服力,因为每个组件都有一个生成树,所以没有其他地方可以扩展。我不确定什么是没有可能赋值的图。如果您有一个未连接的节点,这可能被认为是无效的?

更新:我找到了更简单的解决方案。原始答案在底部。这个比较干净,有证据;)

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

行动1:选择任何两个未分配的朋友。将其中一个放在团队A中,另一个放在团队B中。不变量成立,因为新分配的人员相互认识,并且在不同的团队中

行动2:选择任何有指定朋友的人,并将他安排在另一个团队中。不变量是成立的,因为被分配的人是以这样一种方式分配的,以满足它

所以,在每一步,你们选择任何可行的行动,并执行它。重复此操作,直到没有其他可能的操作。这是什么时候发生的?这意味着没有一个未分配的人有任何朋友。因为我们假设每个人都至少有一个朋友,所以您将能够执行这些操作,直到没有人留下

原始答案:

这个问题一开始看起来很复杂,但实际上并不需要火箭科学。对部门的限制相当宽松——每个人只需要另一个团队中的一个朋友

首先考虑一个更简单的情况。假设你有两个团队的人和一个额外的球员迟到了,需要分配给两个现有团队中的一个。如果他根本没有朋友,那是不可能的。但如果他确实有朋友,你可以选择他的一个朋友,然后把新来的人分配给另一个团队

结果如何?如果你能从一些小团队开始,然后安排其他人,让他们总是认识以前来过的人,那么你就是黄金。这意味着我们把最初的大问题简化为两个小问题

解决第一个问题很容易。为了引导团队,只需选择任何两个彼此认识的人,将一个放在A组,另一个放在B组,就可以了


现在,第二个问题是:添加其他人。查看所有已分配到团队的人员,看看他们是否有未分配的朋友。案例1:一个已经分配的家伙有一个未分配的朋友。你可以很容易地把他添加到某个地方。案例2:所有被分配的人的朋友都已经被分配了。这意味着最初的友谊图没有连接,也没有任何伤害-只需随机将任何未分配的家伙放在任何地方。

左侧的
列表的目的是什么?@exilit它的目的是存储目前两支球队中都没有任何朋友的球员。尝试这样做的目的不是吗找出并实现一个好的竞争问题算法?我的意思是,假设这里有人提出了一个巧妙的算法;然后呢?你好吗