T1(好像是TCO 500分题)
题意:给你个DAG,要你选择一个拓扑序使得最大子段和最大,n<=50
题解:一个拓扑序可以分成三部分,假设把这三部分的点标一个标号(0/1/2),即000001111122222
如果a->b有边,那么val[a]<=val[b]。于是可以转化为切糕模型,拿网络流来做...
S->i(0),i+n->T(0),i->i+n(-val[i])
a[i]->b[i](inf),a[i]+n->b[i]+n(inf)
跑dinic就好了...
T2
题意:给你个DAG,每个点要硬点一个0/1权值,选0/1有个贡献,对于每条边a[i]->b[i],a[i]选0,b[i]选1有个贡献;a[i]选1,b[i]选0有个贡献.问怎么选贡献最大,n<=50
题解:假设在拓扑序上把0/1标出来,那么一段相连的0或1就可以缩成一个点.把这些点重新标号,比如10101010就标号成12345678.
于是可以转成切糕模型,同样对每个点设个权值val,那么val[a]<=val[b].
对于val[i],若val[i]为偶数就说明选了0,否则就是选了1
建一建图跑dinic就好了...