G. Petya and Graph(经典项目与项目消耗问题)(网络流)
题:https://codeforces.com/contest/1082/problem/G
题意:给定有边权和点权的图,问你选一些边,然sum边-sum点最大(点权被多次用为公共点只会减一次)
分析:求最大闭合子图
选了点就要减去该点点权,选了边就加边权,然而俩点确定一边,我们可以理解为要做成一件事需要消耗(点权),事成后会有一定的利益(边权)。
这就和网络流24题中的第二题很像了,也是经典的求利润最大化的问题,可以网络流解决,具体如下:
总的操作:先算总的利益,再减去最小割。
对于利益,我们连容量为利益的边到超级起点,若最大流跑过这条边,就说明这条边不取,(即原图中的边不取)即在总的操作中是减去的;
对于消耗,我们连容量为消耗的绝对值的边到超级汇点,若最大流跑过,就说明这条边取,(即原图中的点取),在总的操作中也是呈现减去的(消耗当然对于答案来说是减去的);
而总的利益是不变的,所以求最小的割。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1e5+;
const ll INF=1e18;
int head[M],deep[M],cur[M];
int tot,s,t;
struct node{
int u,v,nextt;
ll w;
}e[M<<];
void addedge(int u,int v,ll w){
e[tot].v=v;
e[tot].w=w;
e[tot].nextt=head[u];
head[u]=tot++;
e[tot].v=u;
e[tot].w=;
e[tot].nextt=head[v];
head[v]=tot++;
}
bool bfs(){
for(int i=;i<=t;i++)
deep[i]=;
queue<int>que;
que.push(s);
deep[s]=;
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=head[u];~i;i=e[i].nextt){
int v=e[i].v;
if(e[i].w>&&deep[v]==){
deep[v]=deep[u]+;
if(v==t)
return true;
que.push(v);
}
}
}
return deep[t]!=;
}
ll dfs(int u,ll fl){
if(u==t)
return fl;
ll ans=,x=;
for(int i=cur[u];~i;i=e[i].nextt){
int v=e[i].v;
if(e[i].w>&&deep[v]==deep[u]+){
x=dfs(v,min(fl-ans,e[i].w));
e[i].w-=x;
e[i^].w+=x;
ans+=x;
if(ans==fl)
return ans;
if(e[i].w)
cur[u]=i; }
}
if(ans==)
deep[u]=;
return ans;
}
ll dinic(){
ll res=;
while(bfs()){ for(int i=;i<=t;i++)
cur[i]=head[i];
res+=dfs(s,INF);
}
return res;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
s=,t=m+n+;
for(int i=;i<=t;i++)
head[i]=-;
for(int u,v,i=;i<=n;i++){
ll w;
scanf("%I64d",&w);
addedge(i,t,w);
} ll ans=;
for(int u,v,i=;i<=m;i++){
ll w;
scanf("%d%d%I64d",&u,&v,&w);
addedge(n+i,u,INF);
addedge(n+i,v,INF);
addedge(s,n+i,w);
ans+=w;
} printf("%I64d\n",ans-=dinic());
return ;
}
G. Petya and Graph(经典项目与项目消耗问题)(网络流)的更多相关文章
- Codeforces 1082 G - Petya and Graph
G - Petya and Graph 思路: 最大权闭合子图 对于每条边,如果它选了,那么它连的的两个点也要选 边权为正,点权为负,那么就是求最大权闭合子图 代码: #pragma GCC opti ...
- CF1082G:G. Petya and Graph(裸的最大闭合权图)
Petya has a simple graph (that is, a graph without loops or multiple edges) consisting of n n vertic ...
- CodeForces 1082 G Petya and Graph 最大权闭合子图。
题目传送门 题意:现在有一个图,选择一条边,会把边的2个顶点也选起来,最后会的到一个边的集合 和一个点的集合 , 求边的集合 - 点的集合最大是多少. 题解:裸的最大权闭合子图. 代码: #inclu ...
- Petya and Graph/最大权闭合子图、最小割
原题地址:https://codeforces.com/contest/1082/problem/G G. Petya and Graph time limit per test 2 seconds ...
- 【华为云实战开发】10.经典的C++项目怎么在云端开发?【华为云技术分享】
1 概述 1.1 文章目的 本文主要想为研发C++项目的企业或个人提供上云指导,通过本文中的示例项目 “音频解析器”,为开发者提供包括项目管理,代码托管,代码检查,编译构建,测试管理的操作指导,覆盖软 ...
- Petya and Graph(最小割,最大权闭合子图)
Petya and Graph http://codeforces.com/contest/1082/problem/G time limit per test 2 seconds memory li ...
- 前端开发工程师 - 06.Mini项目实战 - 项目简介
第6章--Mini项目实战 项目简介 Mini项目简介-Ego社区开发 回顾: 页面制作 页面架构 JavaScript程序设计 DOM编程艺术 产品前端架构 实践课Mini项目--Ego: 主题:漫 ...
- Ionic01 简单介绍、环境搭建、创建项目、项目结构、创建组件、创建页面、子页面跳转
1 Ionic 基本介绍 Ionic 是一款基于 Angular.Cordova 的强大的 HTML5 移动应用开发框架 , 可以快速创建一个跨平台的移动应用.可以快速开发移动 App.移动端 WEB ...
- eclipse导入web项目之后项目中出现小红叉解决办法
项目中有小红叉我遇到的最常见的情况: 1.项目代码本身有问题.(这个就不说了,解决错误就OK) 2.项目中的jar包丢失.(有时候eclipse打开时会出现jar包丢失的情况,关闭eclipse重新打 ...
随机推荐
- tomcat迁移到weblogic的几个问题
第1个问题: 异常描述:VALIDATION PROBLEMS WERE FOUND problem: cvc-enumeration-valid: string value '3.0' is not ...
- Spring耗时拦截器(url,restful)
import java.io.IOException; import java.util.Date; import javax.servlet.Filter; import javax.servlet ...
- WebSocket实现简易聊天室
前台页面: <html> <head> <meta http-equiv="Content-Type" content="text/html ...
- SpringMVC错误,商品添加信息HTTP Status 400 – Bad Request
记录一个自己在做商品信息显示与传递数据的时候出现的错误, HTTP Status 400 – Bad Request Type Status Report Description The server ...
- C#构造函数调用其他构造函数
http://blog.csdn.net/dogfish/article/details/6990266 <-- 虏来的地 public class Class1 { public Class ...
- A. Yellow Cards ( Codeforces Round #585 (Div. 2) 思维水题
---恢复内容开始--- output standard output The final match of the Berland Football Cup has been held recent ...
- LVM中逻辑卷的最大大小限制
前言: 本文是对这篇博客Maximum Size Of A Logical Volume In LVM的翻译,敬请尊重原创和翻译劳动成果,那些随意转载的大爷们,好歹也自觉注明出处.谢谢! 英文原文地址 ...
- CountDownLatch和CyclicBarrier和Semaphore最通俗形象解释
应该还有好多同学对这三个的区别比较模糊,网络上其他文章说的也比较专业化.所以我在这里举个例子说明这三个的区别. 我们假定有一场百米比赛,比赛包括十个运动员和一个裁判,每个运动员和每个裁判都是一个线程, ...
- POJ-1733 Parity game(带权并查集区间合并)
http://poj.org/problem?id=1733 题目描述 你和你的朋友玩一个游戏.你的朋友写下来一连串的0或者1.你选择一个连续的子序列然后问他,这个子序列包含1的个数是奇数还是偶数.你 ...
- 批量导入数据表(oracle)
批量导入数据表(oracle) 1.登陆plsql 2.找到菜单栏 工具>>导入数据>>新增图标(会提示选择*.csv文件) 选择如上图所示 3.选择数据并导入 4.下图为执行 ...