分析

发这篇博客的目的就是要让你们知道博主到底有多菜。

类似于[NOI2006]最大获利。(明明就是一模一样好吧!)

不知道怎么了,半秒就想到用网络流,却没想出怎么建图。

连这么简单的题都没做出来,我实在是太菜了。

反思反思!

简述一下建图方式:

把原图中的边看作点。

  1. S向每条边对应的的点连边,容量为边权。

  2. 每条边对应的点向这条边连接的两个点连边,容量为\(1e18\)。

  3. 每个原图中的点向T连边,容量为点权。

答案即为总边权-最小割。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <queue>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
using std::cin;
using std::cout;
using std::endl;
typedef long long LL; inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x;
} const int MAXN=1005;
int n,m,S,T;
int ecnt=1,head[MAXN<<1];
int a[MAXN];
int dep[MAXN<<1],cur[MAXN<<1];
LL maxflow,mincut;
std::queue<int> q;
struct Edge{
int to,nxt;
LL cap;
}e[MAXN<<3]; inline void add_edge(int bg,int ed,LL ca){
ecnt++;
e[ecnt].to=ed;
e[ecnt].nxt=head[bg];
e[ecnt].cap=ca;
head[bg]=ecnt;
} inline bool bfs(){
memset(dep,0,sizeof dep);
while(!q.empty()) q.pop();
rin(i,1,T) cur[i]=head[i];
dep[S]=1;
q.push(S);
while(!q.empty()){
int x=q.front();
q.pop();
trav(i,x){
int ver=e[i].to;
if(!dep[ver]&&e[i].cap){
dep[ver]=dep[x]+1;
q.push(ver);
}
}
}
return dep[T]>0;
} LL dfs(int x,LL pref){
if(x==T||!pref) return pref;
LL flow=0,temp;
for(int &i=cur[x];i;i=e[i].nxt){
int ver=e[i].to;
if(dep[ver]!=dep[x]+1) continue;
if(!(temp=dfs(ver,std::min(pref,e[i].cap)))) continue;
pref-=temp;
flow+=temp;
e[i].cap-=temp;
e[i^1].cap+=temp;
if(!pref) return flow;
}
return flow;
} inline void dinic(){
while(bfs()) maxflow+=dfs(S,1e18);
} int main(){
n=read(),m=read();
S=n+m+1,T=S+1;
rin(i,1,n){
a[i]=read();
add_edge(m+i,T,a[i]);
add_edge(T,m+i,0);
}
LL ans=0;
rin(i,1,m){
int u=read(),v=read();
LL w=read();
add_edge(S,i,w);
add_edge(i,S,0);
add_edge(i,m+u,1e18);
add_edge(m+u,i,0);
add_edge(i,m+v,1e18);
add_edge(m+v,i,0);
ans+=w;
}
dinic();
mincut=maxflow;
ans-=mincut;
printf("%I64d\n",ans);
return 0;
}

[CF1082G]Petya and Graph:最小割的更多相关文章

  1. Petya and Graph(最小割,最大权闭合子图)

    Petya and Graph http://codeforces.com/contest/1082/problem/G time limit per test 2 seconds memory li ...

  2. CodeForces1082G Petya and Graph 最小割

    网络流裸题 \(s\)向点连边\((s, i, a[i])\) 给每个边建一个点 边\((u, v, w)\)抽象成\((u, E, inf)\)和\((v, E, inf)\)以及边\((E, t, ...

  3. CF1082G Petya and Graph(最小割,最大权闭合子图)

    QWQ嘤嘤嘤 感觉是最水的一道\(G\)题了 顺便记录一下第一次在考场上做出来G qwqqq 题目大意就是说: 给你n个点,m条边,让你选出来一些边,最大化边权减点权 \(n\le 1000\) QW ...

  4. poj2125Destroying The Graph(最小割+输出方案)

    题目请戳这里 题目大意:给一张有向图,现在要选择一些点,删掉图中的所有边.具体操作为:选择点i,可以选择删除从i出发的所有有向边或者进入i的所有有向边,分别有个代价ini和outi,求最小的代价删掉所 ...

  5. poj 2125 Destroying The Graph 最小割+方案输出

    构图思路: 1.将所有顶点v拆成两个点, v1,v2 2.源点S与v1连边,容量为 W- 3.v2与汇点连边,容量为 W+ 4.对图中原边( a, b ), 连边 (a1,b2),容量为正无穷大 则该 ...

  6. CF1082G Petya and Graph

    题意 定义图权 = 图中边权总和 - 图中点权总和(空图的图权=0),求 n 个点 m 条边的无向图最大权子图. 把边看成点,这个点与两个原图中的点连边.直接最小割求最大闭合子图即可.

  7. POJ 2125 Destroying The Graph [最小割 打印方案]

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8311   Accepted: 2 ...

  8. Petya and Graph/最大权闭合子图、最小割

    原题地址:https://codeforces.com/contest/1082/problem/G G. Petya and Graph time limit per test 2 seconds ...

  9. CF1082G:G. Petya and Graph(裸的最大闭合权图)

    Petya has a simple graph (that is, a graph without loops or multiple edges) consisting of n n vertic ...

随机推荐

  1. 20191110 Spring Boot官方文档学习(4.2)

    4.2.外部化配置 Spring Boot使您可以外部化配置,以便可以在不同环境中使用相同的应用程序代码.您可以使用Properties文件,YAML文件,环境变量和命令行参数来外部化配置.属性值可以 ...

  2. netcat命令用法

    1,端口扫描nc -z -v -n 172.31.100.7 21-25 2,聊天Server:nc -l 1567Client:nc 172.31.100.7 1567 3,文件传输Server:n ...

  3. [Git] 020 stash —— Git 中的”皮姆粒子“

    0. 我准备模拟两种情况 第一种 第二种 情况简析 仓库中的最新版本发现 Bug,需要立即修复 当前在 "dev" 分支中工作到一定程度,尚不能提交,但删之可惜 ps: 在分支中没 ...

  4. [转帖]探秘华为(一):华为和H3C(华三)的爱恨情仇史!

    探秘华为(一):华为和H3C(华三)的爱恨情仇史! https://baijiahao.baidu.com/s?id=1620703498823290828&wfr=spider&fo ...

  5. echart 柱状图X轴显示不全

    z要设置interval为0就可以了 xAxis: [ { type: "category", boundaryGap: false, data: [], axisLine: { ...

  6. HDU 3466 Proud Merchants 带有限制的01背包问题

    HDU 3466 Proud Merchants 带有限制的01背包问题 题意 最近,伊萨去了一个古老的国家.在这么长的时间里,它是世界上最富有.最强大的王国.因此,即使他们的国家不再那么富有,这个国 ...

  7. 嵌入式软件工程师C语言经典笔试2

    1. 使用宏定义swap函数,不使用中间变量 #define swap(x,y) {(x) = (x) + (y);(y) = (x) - (y);(x) = (x) - (y)} 2. 实现字符串的 ...

  8. homestead修改php版本

    登录后 如果之前没有设置过root密码 sudo passwd root 以root 权限执行如下命令,选择对应php版本 # 查看所有 php 版本和当前版本 update-alternatives ...

  9. spring boot 枚举使用的坑3

    上一篇说到spring boot 使用jackson在枚举enum序列化和反序列化的问题, 再来说说在JPA中实体entity使用枚举的问题. 还是这个枚举: @Getter @AllArgsCons ...

  10. Vue环境搭建和项目创建

    目录 vue项目 环境搭建 项目创建 vue项目 环境搭建 node node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城 ...