题意:给定\(n\)门课和\(m\)个学期,每门课在每个学期有不同的得分,需要选定一个学期去完成,但存在约束条件,共有\(k\)对课程需要\(a\)在\(b\)开始学前学会,求最大得分(原问题是求最高平均得分)
把问题转换为最小损失得分,那么可以用最小割来求解
\(Y[i][j]\)为第\(i\)门课在\(j\)学期损失的学分,若不存在则设为正无穷
那么每一门课
\(i\)都要拆
\(m\)个点,表示为
\((i,j)\),源
\(S\)和
\((i,1)\)的容量为
\(Y[i][1]\),其他学期相互连边,容量为
\(Y[i][j]\),
注意到汇点
\(T\)时是
\((i,m)\)到
\(T\),边不可割,所以也为正无穷
前置课程需要保证\(b\)在第一学期不可能被割(正无穷边),且\(a\)被割都得在\(b\)被割的前面,即对于\(i>1\)的学期都要有\((a,i-1)\)到\((b,i)\)的边,容量为正无穷
#include #include #include #include #include #include #include #include #include #include #include #include