一个图 给n个点m条边(u,v,w),每个点和边有相应的权值,若花费了2点的权值就可以得到2点间的边的权值,问可能得到的最大获利。
sum = sigma(wi)
建 立 一 个 二 部 图 ,左 边 是 边 , 右边 是 节点, , 源 流 向 所 有 的 边 , 边 权 为 收益 ;
原 图 中 每 条 边 的 两 个 基 站 所 对 应 的 结 点 流 向 这 条 边 所 对 应 的 结 点 , 边 权 为 无 穷 ; 所 有 边 对 应
的 结 点 流 向 汇 , 边 权 为 这 条 边 的 收 益 。
在 找 其 最 小 割 的 时 候 , 对 于 每 条 边 , 要 么 割 掉 z 要 么 割 掉 x + y , 最 大 流 会 帮 我 们 找 到 最
小 的 割 法 。
切割就使得2点不连通。
int main(){
int i , j , n , m , sum , u , v , w ;
while(cin>>n>>m){
init() ;
sourse = n + m + 1 ;
meet = n + m + 2 ;
for(i = 1 ; i <= n ; i++){
scanf("%d" , &w) ;
add(i , meet , w) ;
}
sum = 0 ;
for(i = 1 ; i <= m ; i++){
scanf("%d%d%d" , &u , &v , &w) ;
add(sourse , i+n , w) ;
add(i+n , u , inf) ;
add(i+n , v , inf) ;
sum += w ;
}
printf("%d\n" , sum - maxflow()) ;
}
return 0 ;
}