现在有一个有向图,每个点有点权,点权可正可负。对于任意一条有向边i和j,选择了点i就必须选择点j,你需要选择一些点使得得到权值最大。
这个问题可以用网络流解决。
建图方法:对于任意点i,如果i权值为正,s向i连容量为其权值的边,否则i向t连容量为其权值的绝对值的边。原图所有边容量为正无穷。则最大权=正权和-最大流。
如何证明呢?我们把最大流理解成最小割,那么割掉的边一定不可能是正无穷的边。
我们发现,选择一个正权点即不割掉s到其的边,选择一个负权点即割掉其到t的边。
现在证明方案合法。
对于依赖关系i到j:
假设i点权为正j点权为负。选了i不选j即没有割掉s到i的边而且没有割掉j到t的边,显然s和t联通,不符合最小割定义。
假设i点权为负j点权为正。选了i不选j即割掉i到t的边而且割掉s到j的边,由于s到t现在不连通,我们不割这两条边同样s和t是不联通的,那么割这两边不满足割量最小,不符合最小割定义。
其余情况同理,不符合割量最小。
注意这个算法不需要原图是DAG。