3
解决手推车问题
哲学家们一直在思考台车问题。不幸的是,还没有人解决过这个问题。幸运的是,作为程序员,我们可以使用计算机为我们解决问题! 输入值 您的程序将输入一个(有限的)有向图(最多有一个从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(使循环返回自身的路径) 。