一个小小的背景故事:自从我用C编码(一年)以来已经很长时间了。重新回到这一点真的是压倒性的。
我需要一些关于实施的建议。 有人可以解释你将如何设计这个吗?我理解问题的概念,但对如何开始实施感到迷茫。
以下是限制因素:
输入(给定算法):
网络中的计算机数量,指定为N.假设计算机名为1,2 ..最多为N.
由三元组列表(C1,C2,t)组成的日志。在每个三元组中,C1和C2是计算机名称,t是时间戳。如果(C1,C2,t)出现在日志中,则意味着C1和C2在时间t彼此通信。 (t将始终是一个整数> =到0)
有一台计算机,CBad,它是首次引入恶意软件的计算机的名称。还有一个时间戳tBad,它是在CBad中引入恶意软件的时间。
感染力学:
如果计算机(例如C0)被感染而另一台计算机,C1在时间t与C0通信,那么C也会被感染。 (它会在时间t被感染。)
如果计算机在时间t被感染,那么它在任何时候被感染t1> = t(换句话说,它被认为在那时被感染并且之后的任何点被感染)
此处的预期输出是一个txt文件,显示由于CBad(我们的患者0)在时间tBad被感染而感染计算机的列表。
我们一直在讨论最小生成树算法(特别是Prims和Kruskals)我非常确定他想要使用其中一种来解决这个问题。
到目前为止的想法: 到目前为止,我的理论是,在每个三元组列表中,C1和C2表示构成边的两个顶点。时间戳t代表成本/重量/任何边缘。不知何故,我必须建立一个连接的无向图,然后运行(Kruskal算法?)来找到这个集合?......我只是不知道。我觉得这里像个白痴。 :(
答案 0 :(得分:1)
你是在思考问题。虽然可以将场景的一部分表示为有向图,但这种表示似乎并不适用于此处的任何有用的优化。 (特别是因为t
并不代表任何类似于体重的行为。)相反,请考虑一种直截了当的方法:
CBad
。t < tBad
。t
。(C1, C2, t)
:
C1
位于S
,请将C2
添加到S
。S
。这是O(n log n)
,因为我们必须对列表进行排序。可能有一些聪明的方法来制作它O(n)
,但我有点怀疑它。