在通信计算机网络中计算受恶意软件感染的计算机集?

时间:2015-10-26 04:10:50

标签: c algorithm graph-algorithm greedy minimum-spanning-tree

一个小小的背景故事:自从我用C编码(一年)以来已经很长时间了。重新回到这一点真的是压倒性的。

我需要一些关于实施的建议。 有人可以解释你将如何设计这个吗?我理解问题的概念,但对如何开始实施感到迷茫。

以下是限制因素:

输入(给定算法):

  1. 网络中的计算机数量,指定为N.假设计算机名为1,2 ..最多为N.

  2. 由三元组列表(C1,C2,t)组成的日志。在每个三元组中,C1和C2是计算机名称,t是时间戳。如果(C1,C2,t)出现在日志中,则意味着C1和C2在时间t彼此通信。 (t将始终是一个整数> =到0)

  3. 有一台计算机,CBad,它是首次引入恶意软件的计算机的名称。还有一个时间戳tBad,它是在CBad中引入恶意软件的时间。

  4. 感染力学:

    1. 如果计算机(例如C0)被感染而另一台计算机,C1在时间t与C0通信,那么C也会被感染。 (它会在时间t被感染。)

    2. 如果计算机在时间t被感染,那么它在任何时候被感染t1> = t(换句话说,它被认为在那时被感染并且之后的任何点被感染)

    3. 此处的预期输出是一个txt文件,显示由于CBad(我们的患者0)在时间tBad被感染而感染计算机的列表。

      我们一直在讨论最小生成树算法(特别是Prims和Kruskals)我非常确定他想要使用其中一种来解决这个问题。

      到目前为止的想法: 到目前为止,我的理论是,在每个三元组列表中,C1和C2表示构成边的两个顶点。时间戳t代表成本/重量/任何边缘。不知何故,我必须建立一个连接的无向图,然后运行(Kruskal算法?)来找到这个集合?......我只是不知道。我觉得这里像个白痴。 :(

1 个答案:

答案 0 :(得分:1)

你是在思考问题。虽然可以将场景的一部分表示为有向图,但这种表示似乎并不适用于此处的任何有用的优化。 (特别是因为t并不代表任何类似于体重的行为。)相反,请考虑一种直截了当的方法:

  • 初始化一组节点(代表“受感染”的计算机)仅包含CBad
  • 从列表中删除包含t < tBad
  • 的所有三元组
  • t
  • 对剩余的三元组进行排序
  • 对于新排序列表中的每个三元组(C1, C2, t)
    • 如果C1位于S,请将C2添加到S
  • 返回S
  • 的内容

这是O(n log n),因为我们必须对列表进行排序。可能有一些聪明的方法来制作它O(n),但我有点怀疑它。