有些学生希望通过向每个n
讲座发送最少数量的学生来最小化他们的讲座出勤率。
i
从时间a[i]
开始,到时间b[i]
结束r[i][j]
时间从讲座i
转到讲座j
是否有算法计算参加所有讲座所需的最少学生人数?
答案 0 :(得分:1)
将类视为图中的节点。如果可以及时从讲座(i,j)
转到讲座i
,则在图表中构建节点对j
之间的边。图形的“根”节点是当天的第一类(在任何其他类到达该类之前开始的类)。
第一个关键观察是图表是有针对性的和非循环的(你不能及时回溯)。
您的目标是找到图表中的最小路径数,以便每个节点至少访问一次。这立即导致了第二个关键的观察,即这可以贪婪地完成。
所以算法如下:
minNumStudents
使用动态编程找到DAG中最长的路径很简单:
ordering
dist
元素(图表中的节点数)保留数组V
,初始化为0
prev
元素保留数组V
,将前一个节点存储在路径中然后
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
回溯来计算最长路径。