分析

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

类似于[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. 20191118 Spring Boot官方文档学习(4.8)

    4.8. RSocket RSocket参考 RSocket是用于字节流传输的二进制协议.它通过单个连接传递的异步消息来启用对称交互模型. Spring框架的spring-messaging模块在客户 ...

  2. mysql 登录和退出 和简单得操作命令

    {} 是必须要有得,[]是可有,可没有得... SHOW WARNINGS (查看警告信息) SHOW CREATE DATABASE T1; (查看数据得创建sql语句)

  3. librdkafka 安装

    1,Git clone git clone https://github.com/edenhill/librdkafka.git 2,cd librdkafka/ 3,./configure 4,ma ...

  4. Java本周总结1

    这两周我上认真的课应该就是李老师的课了/ 第一周主要跟我们讲述了java的发展史何java开发环境的搭建,带领我们走进了java,李老师的精彩讲述让我们对Java有了深刻的认识/. jdk下载安装包我 ...

  5. Linux 创建与删除(5)

    相对于Windows下的右键新建文件与删除,我更喜爱Linux下的命令式创建与删除,真的方便.不过Windows下也可以借助工具来实现,比如git bash.cmder等等终端工具. 创建文件 新建文 ...

  6. 2019.07.06 纪中_B

    今天的题看起来都很简单,结果就爆炸了 做题时:怎么都是图论??? 结果最后好多是DP(最恐怖的是还有我没学过的状压DP) 2019.07.06[NOIP提高组]模拟 B 组 做了两题(稍微腐败了一下) ...

  7. 6-1 如何读写csv数据

    >>> from urllib import urlretrieve >>> urlretrieve('http://table.finance.yahoo.com ...

  8. golang 一个字符串表达式替换的函数

    package util import ( "fmt" "reflect" "regexp" "strconv" &qu ...

  9. asp.net后台cs中的JSON格式变量在前台Js中调用方法

    //后台cs代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...

  10. Linux基础命令四

    iptables iptables -F:关闭防火墙 crontab -l查看定时任务 crontab -e :编辑定时任务 log日志相关: ls  /var/log:查看日志 du -sh  /v ...