hdu 3879 最大获利问题

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值