哲学家们一直在思考台车问题。不幸的是,还没有人解决过这个问题。幸运的是,作为程序员,我们可以使用计算机为我们解决问题!
输入值
您的程序将输入一个(有限的)有向图(最多有一个从x
到的边y
,对于任何x
和而言y
),并带有一个指定的节点,并且在每个边上附加一个非负整数(表示与该轨道相关的人数) 。另外,每个节点至少具有一个出口边缘。
手推车从指定的节点开始。每次转弯时,如果手推车在节点处x
,那么功利主义者就会选择一条边(x,y)
。那个边缘的人死了,手推车现在处于边缘y
。这个过程将永远持续下去。
请注意,人只能死一次,因此,如果边缘(x,y)
将n
人绑在其上,而手推车经过它们,例如,滑过100次,它仍然只会导致n
死亡。
输出量
功利主义者以使死亡人数最小化的方式做出选择(这是有限的,因为只有有限的人)。您的程序将输出该号码。
输入格式
您可以按照自己喜欢的任何合理方式获取输入图。例如,您可以将其作为矩阵,并将指定的节点计为标记为0的节点。或者可以使用x1,y1,n1;x2,y2,n2;...
。例如0,a,0;a,b,5;a,c,1;b,b,0;c,c,0
,代表标准手推车问题(末尾带有循环)。
测试用例
0,a,0;a,b,5;a,c,1;b,b,0;c,c,0
-> 1(从0到a,从a到c(杀死一个人),然后继续将手推车从c循环到c)。0,0,1;0,a,5;a,a,0
-> 1(保持从0到0,永远超过1个人),0,a,5;0,b,1;a,a,1;b,b,6
-> 6(0-> a-> a-> a-> a-> ...(请注意,转到b的贪婪解是不正确的))0,a,1;0,b,5;a,b,1;b,a,1
-> 3(0-> a-> b-> a-> b-> ...)0,a,1;0,b,1;a,a,0;b,b,0
-> 1(请注意,功利主义者可能采取两种不同的选择,即两者都只会杀死一个人)
这是代码高尔夫球,所以最短的答案会成功!祝好运。
注意:不会出现恶性循环,并且禁止多轨漂移。同样,尽管我更喜欢从阿西莫夫的三个定律来考虑这个问题,彼得·泰勒在沙盒中指出,这个问题在数学上等同于找到权重最低的rho(使循环返回自身的路径) 。