实习下班,在地铁上,一起实习的同事问了我一个他自己随便想到的问题:
有n个人m种语言,每个人都会这m种语言中的若干语言(可能为零也可能是所有),所谓会,也即能听懂也能说。现在某个人掌握了一条信息,如果他用他会的某一种语言说出这条信息,则所有会这种语言的人都能领悟,并且他们各自将用自己所会的所有语言再复述这条信息,不断下去。试问,指定的那个人至少用多少种语言说出那条信息,可以使得最终所有人都能得到信息,或者判断这是不可能做到的。
我乍一想,应该可以用网络流解决本问题。但是当我仔细思考建模后,发现我并不能建出一个图来。再往经典图论算法上思考,可以对做语言传播的一个传递闭包,能够计算出每个语言能与哪些语言联通。但原问题最终目的是要让所有人接收到信息,还是要将人作为图中的信息。那么语言应当作为中间信息作为辅助,建立人之间信息传递闭包。即得出某一个人如果得到信息,则有多少人也会因此最终得到信息。那么,第一个人的每一种语言对应于一个除去他之外的人的集合,也即如果他用这种语言说出了信息,最终得到信息的人的集合,这时我发现这个问题最终居然形式上基本类同于集合覆盖SCP(https://en.wikipedia.org/wiki/Set_cover_problem)只不过集合的并集未必是全集,也即存在第一个人用所有他会的语言说出,也不能使得最终所有人得到信息。
这个问题按照我上述的思路应当确实最终规约到了SCP,目前我也并没有想到多项式复杂度的算法。
时间: 2024-10-17 22:30:07