hdu 3879 最大获利问题

来源:互联网 发布:长沙网络推广wyztg 编辑:程序博客网 时间:2024/06/05 23:40

一个图 给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 ;}




0 0