计算参加系列讲座的最少学生人数

时间:2011-04-18 06:06:33

标签: algorithm graph

有些学生希望通过向每个n讲座发送最少数量的学生来最小化他们的讲座出勤率。

  • 讲座i从时间a[i]开始,到时间b[i]结束
  • 需要r[i][j]时间从讲座i转到讲座j

是否有算法计算参加所有讲座所需的最少学生人数?

1 个答案:

答案 0 :(得分:1)

将类视为图中的节点。如果可以及时从讲座(i,j)转到讲座i,则在图表中构建节点对j之间的边。图形的“根”节点是当天的第一类(在任何其他类到达该类之前开始的类)。

第一个关键观察是图表是有针对性的和非循环的(你不能及时回溯)。

您的目标是找到图表中的最小路径数,以便每个节点至少访问一次。这立即导致了第二个关键的观察,即这可以贪婪地完成。

所以算法如下:

  1. 查找有向无环图(DAG)中的最长路径
  2. 从图表中删除该路径中找到的节点
  3. 增量minNumStudents
  4. 重复,直到图表中没有更多节点
  5. 使用动态编程找到DAG中最长的路径很简单:

    1. 计算图表的topological order ordering
    2. 使用dist元素(图表中的节点数)保留数组V,初始化为0
    3. 使用prev元素保留数组V,将前一个节点存储在路径中
    4. 然后

      for each vertex `V` in `ordering`
          for each edge (V,W)
              dist[W] = min(dist[W],dist[V]+1)
              prev[W] = V;
      

      您的最长路径以W结束,dist[W]最大。并且可以使用W数组从prev回溯来计算最长路径。