【题解】[TJOI2010]电影迷
[TJOI2010]电影迷
题目大意:
选择
i 获得v_i 的价值,选择i 但是不选择j 失去d_{i,j} 的价值(不可逆)。求\max(\text{最大价值},0) 。
〇、前言
这里介绍两种方法。同时请确保你会最大流的基础算法和一定的最小割基础。
一、ex最大权闭合子图
建图
-
\begin{cases}(s,x,v_x)&v_x>0\\(x,t,-v_x)&v_x<0\end{cases} -
答案
含义
因为建图类似于最大闭合权子图,所以含义也可以类比得出。
-
割掉
s 与x 的边,表示不选择正权点x ;割掉x 与t 的边,表示选择负权点x 。 -
如果
s 与i 有边,表示选择正权点x ;如果x 与t 有边,表示不选择负权点x 。 -
割掉
(x,y) ,表示选择x 但是不选择y ,付出d_{x,y} 的代价。
图示
合法性
如果
图示:
如果
- 割断(选择)了负权点
j 与t 的边(j,t) ,也就是选择了j 的前驱正权点i 和j 。根据最小割的定义,j 的前驱i 不会被割,同时也不选择中间的边(i,j) 。 - 割断了
(i,j) ,也就是选择了正权点i ,不选择负权点j ,恰好减去了所谓的体验值。 - 割断了
(s,i) ,也就是选择了负权点j ,放弃了正权点i ,同时也没有减去体验值。
图示:
最优性
最小割
答案
最小割保证了答案最大。
代码看别的博客吧。
二、集合划分模型
众所周知,最小割不可以跑负权边。
由于有负数,根据数据范围把所有的分数
设
建图
-
(s,i,v'_i),(i,t,base) -
(i,j,d_{i,j})
答案
含义
- 割断
(s,i) 表示i 不选择,割断(i,t) 表示选择i 。
正确性
原来没有加上
根据含义,总共会割
Code:
//Dinic...
const int eps=2e3;
signed main(){
rg int i,x,y,z,sum=0;
read(n);read(m);s=0;t=n+1;
for (i=1;i<=n;i++) read(x),Dinic::ins(s,i,x+eps),Dinic::ins(i,t,eps),sum+=x;
while (m--) read(x),read(y),read(z),Dinic::ins(x,y,z);
sum=sum+eps*n-Dinic::Dinic();
printf("%lld",sum);
return 0;
}