Questions tagged «graph-theory»

对于有关图形的挑战,使用数学结构来建模对象之间的关系。

4
紧密连接的组件
如果图形中存在彼此之间的路径,则有向图中的两个不同的顶点将牢固连接。图的强连接组件是图的子集,以使子集中的每对不同的顶点都牢固连接,向子集中添加更多的顶点会破坏此属性。 您面临的挑战是将图分离为其紧密连接的组件。具体来说,您必须输出图中的所有SCC。 输入/输出: 作为输入,您可以使用有向边列表,邻接列表,邻接矩阵或任何其他合理的输入格式。询问您是否不确定。您可以假设图形没有完全断开的顶点,并且不存在自身边,但是您可以不做任何进一步的假设。您也可以选择将顶点列表以及顶点数量作为输入。 作为输出,您必须给出顶点的分区,例如顶点列表的列表(其中每个子列表是一个紧密连接的组件),或者给出顶点的标签(其中每个标签对应于一个不同的组件)。 如果使用标签,则标签必须是顶点或连续的整数序列。这是为了防止将计算拖到标签中。 例子: 这些示例获取边的列表,其中每个边从第一个条目指向第二个条目,并输出分区。您可以自由使用此格式或其他格式。 输入在第一行,输出在第二行。 [[1, 2], [2, 3], [3, 1], [1, 4]] [[1, 2, 3], [4]] [[1, 2], [2, 3], [3, 4]] [[1], [2], [3], [4]] [[1, 2], [2, 1], [1, 3], [2, 4], [4, 2], [4, 3]] [[1, 2, 4], [3]] [[1, 2], [2, …

3
循环与循环与循环
挑战 创建一个函数,当给定ASCII艺术作品的输入(引导可能最终循环的路径)时,该函数将输出循环的长度(如果存在)和“尾部”的长度,而其中的“尾部”将通过以下方式之一进入循环表格如下。 输入值 您的输入必须传递给函数。下面是一个简单输入的示例。 # --> # --> # ^ | | | | v # <-- # 您可以像这样可视化上面的块 “尾巴”是一个项目,而循环是四个长。 一个更困难的: # --> # --> # ^ | | | | v # --> # <-- # # --> # ^ ^ | | | | | | v # …

4
在高维格子状图中找到最大的独立集合
对于给定的正整数n,请考虑所有长度为二进制的字符串2n-1。对于给定的字符串S,令其L为一个长度数组,n其中包含1每个长度n为的子字符串中s 的数量S。例如,如果n=3和S = 01010再L=[1,2,1]。我们称L的计数数组S。 我们说两个字符串S1和S2相同长度的比赛,如果他们各自的计数阵列L1和L2具有这样的性质L1[i] <= 2*L2[i],并L2[i] <= 2*L1[i]为所有i。 任务 为了n从开始增加n=1,任务是找到最大的字符串集的大小,每个字符串的长度,2n-1以便没有两个字符串匹配。 您的代码应为的每个值输出一个数字n。 得分了 您的分数是最高n的,没有人为您的任何答案发布更高的正确答案。显然,如果您拥有所有最佳答案,那么您将获得n您发布的最高分数。但是,即使您的答案不是最佳选择,如果没有其他人能打败它,您仍然可以获得分数。 示例答案 因为n=1,2,3,4我得到2,4,10,16。 语言和图书馆 您可以使用任何喜欢的语言和库。在可行的情况下,能够运行您的代码将是一件好事,因此,请尽可能提供有关如何在Linux中运行/编译代码的完整说明。 领先的作品 5由MartinBüttner在Mathematica中撰写 6由Reto Koradi用C ++编写。值是2, 4, 10, 16, 31, 47, 75, 111, 164, 232, 328, 445, 606, 814, 1086。已知前5个是最佳的。 7由Peter Taylor在Java中撰写。值是 2, 4, 10, 16, 31, 47, 76, 111, 166, 235。 9由joriki用Java编写。值是2, …

10
取消图形
介绍 在此挑战中,将为您提供带有自环的有向图,而您的任务是将其转换为无自环的无向图。 输入值 您的输入是一个有向图,其顶点设置{0, 1, ..., n-1}为某个自然数n ≥ 0(或者{1, 2, ..., n}如果您使用基于1的索引)。该图以length- nlist的形式给出,L其中L[i]是顶点的邻居的列表i。例如,列表[[0,1],[0],[1,0,3],[]]代表图形 .-. | v '-0<--2-->3 ^ | | | v | 1<--' 请注意,邻居列表不一定是有序的,但是可以保证它们没有重复。 输出量 您的输出是另一张与输入格式相同的图,可从图获得,如下所示。 删除所有自循环。 对于每个剩余边u -> v,v -> u如果还没有反转边,则添加它。 与输入一样,输出图的邻居列表可能是无序的,但它们不能包含重复项。对于上面的图,正确的输出将是[[1,2],[0,2],[0,1,3],[2]],代表图 0<->2<->3 ^ ^ | | v | 1<--' 规则 您可以在图形中使用基于0或基于1的索引。功能和完整程序都可以接受。最低字节数获胜,并且不允许出现标准漏洞。 测试用例 这些测试用例使用基于0的索引。在基于1的情况下递增每个数字。这些邻居列表按升序排序,但不是必需的。 [] -> [] [[0]] …

15
城市名称游戏
如果愿意,可以编写一个根据城市名称游戏规则对城市进行排序的程序。 城市的每个名称应从前一个城市名称的最后一个字母开始。例如Lviv -> v -> Viden -> n -> Neapolis -> s -> Sidney -> y -> Yokogama -> a -> Amsterdam -> m -> Madrid -> d -> Denwer 在排序列表中,第一个城市的第一个字母和最后一个城市的最后一个字母不应该匹配,不必是相同的字母。 您可以假设城市名称只有字母。 程序输出应与输入大写相同 例: % ./script Neapolis Yokogama Sidney Amsterdam Madrid Lviv Viden Denwer ["Lviv", "Viden", "Neapolis", "Sidney", "Yokogama", "Amsterdam", …

11
模拟NFA
阿非确定性有限自动机是一个有限状态机,其中一个元组被映射到多个状态。就是 我们用另一个函数Δ :Q × Σ → P(Q )代替DFA的常规δ :Q × Σ → Q转换函数。(state,symbol)(state,symbol)(state,symbol)δ:Q×Σ→Q δ:Q×Σ→Q \delta : Q \times \Sigma \to Q\ Δ:Q×Σ→P(Q)Δ:Q×Σ→P(Q)\Delta : Q \times \Sigma \to \mathcal{P}(Q) 如果您知道什么是NFA,则可能要跳过下一部分。 正式定义 NFA的唯一描述是 有限状态集QQQ 一组有限的符号ΣΣ\Sigma 跃迁函数Δ:Q×Σ→P(Q)Δ:Q×Σ→P(Q)\Delta : Q \times \Sigma \to \mathcal{P}(Q) 的初始状态q0∈Qq0∈Qq_0 \in Q 一组最终状态F⊆QF⊆QF \subseteq Q 该机在开出和读取符号的有限串w ^ ∈ Σ …

16
确定关系是否可传递
挑战说明 让我们从一些定义开始: 一个关系是一组有序的元素对(在这个挑战中,我们将使用整数) 例如,[(1, 2), (5, 1), (-9, 12), (0, 0), (3, 2)]是一个关系。 如果对于任意两对元素,并且在该关系中还存在一对,则该关系称为可传递的,(a, b)(b, c)(a, c) [(1, 2), (2, 4), (6, 5), (1, 4)]是传递的,因为它含有(1, 2)和(2, 4),但(1, 4)为好, [(7, 8), (9, 10), (15, -5)]是传递的,因为没有任何2双 (a, b),(c, d)存在,使得b= c。 [(5, 9), (9, 54), (0, 0)]不传递,因为它包含(5, 9)和(9, 54),但不包含(5, 54) 给定整数对列表,请确定一个关系是否可传递。 输入输出 您将获得任何合理格式的整数对列表。考虑一个关系 …

5
走迷宫
也许它不是真正的迷宫,但仍然如此。 规则: 输入是一个两行字符串,包括*,1,x和X。那根绳子是迷宫。线的长度相等。 您可以将输入作为带有,(逗号)的字符串或这两行之间的任何方便的分隔符。或者,您也可以将这两行作为函数的单独参数。 输出是退出字符串必须执行的步骤数(最后一步是将您移出字符串的步骤)。 您从左上角(较高的线)开始,在第一个符号之前。 对于每一步,您将向前移动一个符号(从第n个位置到第(n + 1)个位置)。然后,根据您所踩的角色,结果是不同的。这是每个字符的作用: *- 没有。您通常只是踩到它。 x-踩到它后,切换线路,但与起点保持相同的水平距离。例如,您踩到较高行的第三个位置,并在x此处遇到了一个小写字母。然后,您立即移至下一行,但再次移至第三位置。 X-切换线路并转到下一个位置。此处的示例相同,但您也从第三位置移至第四位置(因此,第二行位于第四位置)。 1 -向前移动另一个位置。 每个角色完成工作后,将替换为空格,不再“有效”。 示例如下。 输入: x * 如前所述,您从第一行的第一个符号开始。第一步将您移至字母上x,此字母将您切换至第二行。该字母x不再用作x,而是由代替*。在后面的示例中,这将更有意义。您现在位于底行的星号上,对您没有任何作用。 第二步是将您向前移动,然后退出弦线,因此迷宫完成了,并且花费了2个步骤。 输出 2。 输入: xX* x1* 第一步:继续前进x,这会将您移至x下一行的。这是一条规则,该规则说使用的字符替换为星号。然后,您移回第一行,但x由于它已被使用并成为星号,因此不再存在。因此,您可以安全地在该星号上移动,并且该步骤已完成(您现在位于第一行的第一个位置)。 第二步:继续前进X,它会将您推到较低的线,然后再将您向前推。您现在位于第二行的第三个位置(星号),而从未访问过第二个位置(包含1)。 第三步:向前移动,退出字符串。 输出:3。 测试用例: 输入: *1* xxx 输出:3。(因为1使您跳到第三位置)。在那里您永远不会访问第二行,但这是输入的必需部分。 输入: *X*1*x x*1xx* 输出:4。 输入: 1x1x ***X 输出:3。 输入: 1*x1xxx1*x x*x1*11X1x 输出:6。 输入: xXXXxxx111* …

5
离外部有多远?
取一个2D空间区域,该区域划分为以轴对齐的单位正方形元素,其中心以整数间隔对齐。如果一条边由两个元素共享,则称该边为内部,否则为外部边。 您的目标是找到从每个元素的中心开始(即traversal distance或distance简称为)到达外部边缘必须经过的最小数量的相邻元素。您只能穿过一条边缘(即没有切角/对角运动)。注意,“外部元素”(具有至少一个外部边缘的元素)被认为需要遍历0相邻元素才能到达外部边缘。 输入值 输入是一个非负整数对坐标的列表,表示所有元素中心的(x,y)。假定不存在重叠元素(即x / y对唯一标识一个元素)。您可能不假定有关元素输入顺序的任何信息。 欢迎您将输入的原点转换到任何位置(例如0,0或1,1,等等)。 您可以假定所有输入元素都已连接,或者换句话说,可以使用上述规则从任何一个元素移动到任何其他元素。注意,这并不意味着2D区域只是简单连接。里面可能有孔。 示例:以下为无效输入。 0,0 2,0 不需要错误检查。 输入可以来自任何来源(文件,stdio,函数参数等) 输出量 输出应该是标识每个元素的坐标列表,并遍历相应的整数距离以到达边缘。输出可以按所需的任何元素顺序进行(例如,您不必按与输入相同的顺序输出元素)。 输出可以是任何源(文件,stdio,函数返回值等) 任何与元素的坐标与其外部距离匹配的输出都可以,例如,所有这些都可以: x,y: distance ... [((x,y), distance), ...] [(x,y,distance), ...] 例子 文本示例输入的格式为x,y,每行一个元素;欢迎您将其重塑为方便的输入格式(请参阅输入格式规则)。 文本示例输出的格式为x,y: distance,每行一个元素;同样,欢迎您将其重塑为方便的输出格式(请参见输出格式规则)。 图形数字的左下边界为(0,0),内部数字表示到达外部边缘的预期最小距离。请注意,这些数字仅用于演示目的;您的程序不需要输出这些。 例子1 输入: 1,0 3,0 0,1 1,2 1,1 2,1 4,3 3,1 2,2 2,3 3,2 3,3 输出: 1,0: 0 3,0: 0 …

7
我应该把餐厅放在哪里?
您是一家餐厅的所有者。您将在笛卡尔的一个新区域中打开,那里只有一条主要道路,称为y轴。您要放置餐厅,以使与餐厅和该区域中每个房屋的总距离最小化。 输入: 输入将是 n, the number of houses house1 house2 house3 ... houseN 其中每个房子都是形式上的坐标x y。每个单位代表一公里。 您可以将输入作为字符串,也可以提供一个函数,将选择的任何格式的输入作为其参数。 输出:您餐厅的y坐标(请记住,它将位于y轴上)。实际上,它位于路边,但差异可以忽略不计。 从本质上讲,如果第n个房子是h_n和D是距离函数,那么你要找到k这样D(h_0, (0, k)) + D(h_1, (0, k)) + D(h_2, (0, k)) + ... + D(h_n, (0, k))被最小化。 请注意,距离的计算方式就像客户从他们的房屋到餐厅的直线一样。那是(x, y)到餐厅的距离sqrt(x^2 + (y - k)^2)。 输出应精确到至少2个小数位。 输出可以打印为字符串,也可以从函数返回。 输入/输出示例: Input: 2 5.7 3.2 8.9 8.1 Output: …

11
构造图
在此挑战中,您的任务是根据一系列指令构造一个无向图。每个非负整数都有一个指令,并且每个指令都会将给定的图转换为新的图。 指令0:添加一个新的断开连接的节点。 指令1:添加一个新节点,并将其连接到每个现有节点。 伪指令m > 1:删除度(邻居数)可被整除的所有节点m。请注意,0所有m节点都可以将其整除,因此始终会删除断开连接的节点。 从空图开始,指令从左到右一一应用。例如,[0,1,0,1,0,1,3]使用令人敬畏的ASCII技术对序列进行如下处理。我们从空图开始,并按照的指示添加一个顶点0: a 然后,按照的指示添加另一个顶点并将其连接到第一个顶点1: a--b 我们按照0和的指示添加另一个断开连接的顶点,然后添加一个连接的顶点1: a--b c \ \ / `--d 我们重复这一次,作为导演0和1: ,--f--e / /|\ a--b | c \ \|/ `--d 最后,按照以下指示删除3级顶点a和:b3 f--e |\ | c |/ d 这是由序列定义的图[0,1,0,1,0,1,3]。 输入值 非负整数列表,代表指令序列。 输出量 序列定义的图中的节点数。 测试用例 [] -> 0 [5] -> 0 [0,0,0,11] -> 0 [0,1,0,1,0,1,3] …

1
破坏火车使其迟到[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Code Golf Stack Exchange 的主题。 3年前关闭。 “我想去阿拉伯市场去买一份我爱上的礼物。但是,如果我来得太晚,所有的商店都会关门,我将无法买到任何东西。你能帮忙吗?我吗? “ 目标:在所有商店关门之前从北里士满街(North Richmond Street)带男孩去阿拉比(Araby)。 实际目标:确保男孩在商店关门之前没有到达阿拉比。 您的程序将采用以下格式输入: <time> <map> 哪里 <time>是男孩可以旅行的最长时间,以分钟为单位。它是一个正整数。 <map> 是火车可以走的路线图。 这是图形格式的工作方式: 每个语句以分号结尾。 映射中的节点(代表开关)使用单个小写字母表示。 节点之间的路径用语法表示a,X,b,其中X是表示路径权重的整数。路径的权重是火车经过这两个节点所花费的时间(以分钟为单位)。 阿拉伯文(Araby)代表a,北里士满街(North Richmond Street)代表n。 所有路径都是双向的。 例如,此图(假设路径是双向的): 图片来自Artyom Kalinin,来自Wikimedia Commons。根据CC BY-SA 3.0许可使用。 将在图形符号中记录为: a,4,b;a,2,c;b,5,c;b,10,d;c,3,e;e,4,d;d,11,f; 请注意,此输入没有n,因此是无效的输入。如果输入无效,您的程序可能会执行任何操作。 这是一个示例输入: 21 n,4,b;n,2,c;b,5,c;b,10,d;c,3,e;e,4,d;d,11,a; (这是与上面的图片相同的图形,a用n和f代替了a)。 男孩必须从取得n到a21分钟内。如果他走这条路线n-> c-> e-> d-> a,他会在20分钟内到达那里,这是及时的。我们可以将该路由表示为以逗号分隔的节点列表: n,c,e,d,a 另一方面,路线n-> b-> …

10
如何减慢酒鬼回家的速度
考虑一个看起来像这样的正方形乘n的网格图。 重要的是要注意此图是11 x 11。 在任何给定的点,一个人站在一个十字路口,他一次只能垂直或水平移动一步到下一个十字路口。可悲的是他喝得太多了,所以他从最多4个可能的方向(上,下,左,右)中随机选择方向。最多可以达到4个,就好像他站在墙上时,他只有3个选项,而在角落里,他只有2个选项。 他从左下角开始,目标是回家,即右上角。时间只是他采取的步骤数。 但是,您是一个恶意的对手,希望他尽可能慢地回家。您可以在走动过程中随时删除图形中的任意数量的边。唯一的限制是,您必须始终为他留下回家的某种方式,并且不能删除他已经使用过的边缘。 面临的挑战是设计一个尽可能恶意的对手,然后使用一个随机的醉酒步行者在100 x 100 20 x 20的图形上对其进行测试。您的分数只是随机步行者回家10 000次以上所花费的平均时间。 您可以使用任何喜欢的语言和库,只要它们在Linux中免费可用并易于安装即可。 我需要执行什么? 您应该为随机游走者和对手实施代码,并且应该对代码进行组合,以使运行时的输出只是使用您的对手代码进行1000次运行的平均值。随机沃克代码应该非常简单,因为他只需从(x-1,y),(x + 1,y),(x,y-1)和(x,y + 1)中进行选择即可这些都没有被删除或超出范围。 对手的代码当然要困难得多,还需要记住酒鬼已经走过的边缘,因此他不会尝试删除其中的任何一条,并确保酒鬼还有回家的路,这有点棘手快做。 附录 10的跑位还不够,但是我不想惩罚那些设法长途跋涉的人。由于受欢迎的要求,我现在将其增加到1000。但是,如果步行时间太长,您将无法在现实的时间内进行1000次跑步,请仅报告您可以跑步的最大次数。 高分表100 x 100。 优化程序976124.754。 彼得·泰勒(Peter Taylor)的103000363.218。 编辑1.将图形大小更改为20 x 20,以帮助人们进行测试。当人们提交分数时,我将为该大小做出新的高分。 高分表20比20。 230,794.38 (100k runs) by justhalf 227,934 by Sparr 213,000 (approx) by Peter Taylor 199,094.3 by stokastic …

6
图5着色
老实说,我不敢相信这还没有被问到,但这是 背景 给定一个简单的无向平面(该图可以在没有相交的平面上绘制)图,这是一个证明定理,即该图是4色的,这是我们稍后将要探讨的术语。但是,对图形进行5色绘制要容易得多,这就是我们今天要重点解决的问题。 图的有效k着色是对具有以下属性的图的节点分配“颜色” 如果两个节点通过一条边连接,则这些节点将使用不同的颜色进行着色。 在整个图形中,最多有5种颜色。 鉴于此,我将向您展示一个非常基本的算法,以对任何简单的无向平面图进行5种颜色着色。该算法需要以下定义 可达性:如果节点1可从节点2到达,则意味着存在一系列节点,每个节点通过一条边连接到下一个节点,因此第一个节点是节点2,最后一个节点是节点1。请注意,由于无向图是对称的,如果节点1可从节点2到达,则节点2可从节点1到达。 子图:给定节点集的图的子图N是其中子图的节点全部在N中的图,并且当且仅当两个节点都通过边连接时,原始图的边才在子图中在北 假设Color(N)是为带有5种颜色的N个节点的平面图着色的函数。我们在下面定义函数 查找连接的节点数最少的节点。该节点最多连接5个节点。 从图中删除该节点。 在此新图形上调用Color(N-1)对其进行着色。 将已删除的节点添加回图。 如果可能,请为添加的节点上色,使其所连接的节点都没有该颜色。 如果不可能,则添加节点的所有5个相邻节点都有5种不同的颜色,因此我们必须尝试以下过程。 编号添加节点n1 ... n5周围的节点 考虑原始图中所有节点的子图,其颜色与n1或n3颜色相同。 如果在此子图中,无法从n1到达n3,则在从n1(包括n1)可到达的节点集中,将所有出现的n1颜色替换为n3,反之亦然。现在为添加的节点n1的原始颜色上色。 如果在此新图中从n1可以到达n3,请在节点n2和n4而不是n1和n3上从步骤9开始执行过程。 挑战 给定边列表的输入(代表图形),通过为每个节点分配一个值来为图形着色。 输入:图形中边的列表(即[('a','b'),('b','c')...]) 请注意,输入边列表将使得如果(a,b)在列表中,而(b,a)不在列表中。 输出:包含对值,其中每对的第一个元素是一个节点的一个目标,并且所述第二颜色,即[('a',1),('b',2)...]或{'a':1,'b':2,...} 您可以使用任何东西来代表颜色,从数字到字符,再到其他。 输入和输出非常灵活,只要它很清楚输入和输出是什么即可。 规则 这是一个代码高尔夫挑战 您不必使用我上面描述的算法。它只是那里供参考。 对于任何图形,通常有许多有效的着色方法。只要算法产生的着色有效,就可以接受。 请记住,图表必须是5色。 测试用例 使用以下代码测试着色结果的有效性。由于每个图形有许多有效的图形着色,因此该算法仅检查着色的有效性。请参阅文档字符串以了解如何使用代码。 一些随机(相当愚蠢)的测试用例: 测试案例2:Krakckhardt风筝图 [(0, 1), (0, 2), (0, 3), (0, 5), (1, 3), (1, 4), …

14
递归级联[N]的累积和与M次迭代
取两个正整数N,M并[N]通过M迭代创建的串联累积和。输出最后一次迭代的结果。 串联累积和的定义: 以数字开头N并定义顺序X = [N] 追加到X的累积和X 重复步骤2 M次。 向量的累加和X = [x1, x2, x3, x4]为:[x1, x1+x2, x1+x2+x3, x1+x2+x3+x4]。 N = 1和的示例M = 4: P =累积和函数。 M = 0: [1] M = 1: [1, 1] - X = [1, P(1)] = [[1], [1]] M = 2: [1, 1, 1, 2] - X …
14 code-golf  number  sequence  code-golf  number  sequence  code-golf  binary-matrix  code-golf  math  tips  javascript  algorithm  code-golf  string  code-golf  number  sequence  code-golf  math  arithmetic  parsing  code-golf  number  sequence  primes  code-golf  string  ascii-art  geometry  integer  code-golf  geometry  code-golf  number  array-manipulation  code-golf  math  geometry  code-golf  number  sequence  arithmetic  integer  code-golf  string  kolmogorov-complexity  code-golf  number  code-golf  number  chess  code-golf  sequence  decision-problem  subsequence  code-golf  math  number  primes  code-golf  primes  permutations  code-golf  integer  probability-theory  statistics  code-golf  string  code-golf  sequence  decision-problem  parsing  board-game  code-golf  binary  graph-theory  code-golf  board-game  classification  tic-tac-toe  code-golf  ascii-art  polyglot  code-golf  date  code-golf  geometry 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.