【[TJOI2010]电影迷】
一度自闭
这道题一看就是最小割无疑
我们假设源点\(S\)表示看这个电影,汇点\(T\)表示不看这部电影
如果一个电影的价值为正,我们就从源点点连一条容量为\(val\)的边,表示割掉这个边也就是选择另一边也就是不看的代价为\(val\)
如果为负,就向汇点连一条容量为\(-1*val\)的边,表示选择另一边也就是看的代价是\(val\)
我们发现如果和源点相连就表明这个电影看,和汇点相连就表示不看
而\(x,y\)的关系正好是一个看,一个不看时候的
也就是\(x\)还和源点相连,\(y\)还和汇点相连的时候
于是\(x\)向\(y\)连边容量为价值,在\(x\)看\(y\)不看的时候就必须要割掉这条边
现在一遍最小割就好了
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define re register
#define LL long long
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define INF 99999999
#define del 10000
inline int read()
{
char c=getchar();
int x=0,r=1;
while(c<'0'||c>'9')
{
if(c=='-') r=-1;
c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x*r;
}
struct E
{
int v,nxt,w,f;
}e[500005];
int head[500],cur[500],d[500];
int a[101];
int S,T;
int n,m,num=1;
inline void add_edge(int x,int y,int z)
{
e[++num].v=y;
e[num].nxt=head[x];
head[x]=num;
e[num].w=z;
}
inline void connect(int x,int y,int z){add_edge(x,y,z),add_edge(y,x,0);}
inline int BFS()
{
for(re int i=0;i<=T;i++) cur[i]=head[i],d[i]=0;
std::queue<int> q;
d[S]=1;
q.push(S);
while(!q.empty())
{
int k=q.front();
q.pop();
for(re int i=head[k];i;i=e[i].nxt)
if(!d[e[i].v])
{
if(e[i].w<=e[i].f) continue;
d[e[i].v]=d[k]+1;
q.push(e[i].v);
}
}
return d[T];
}
int dfs(int x,int now)
{
if(x==T||!now) return now;
int flow=0,ff;
for(re int& i=cur[x];i;i=e[i].nxt)
if(d[e[i].v]==d[x]+1)
{
ff=dfs(e[i].v,min(e[i].w-e[i].f,now));
if(!ff) continue;
flow+=ff,now-=ff;
e[i].f+=ff,e[i^1].f-=ff;
if(!now) break;
}
return flow;
}
int main()
{
n=read(),m=read();
int ans=0;
S=0,T=n+1;
for(re int i=1;i<=n;i++) a[i]=read();
for(re int i=1;i<=n;i++)
{
if(a[i]>0) ans+=a[i],connect(S,i,a[i]),connect(i,T,0);
else ans-=a[i],connect(i,T,-1*a[i]),connect(S,i,0);
}
int x,y,val;
for(re int i=1;i<=m;i++)
{
x=read(),y=read(),val=read();
connect(y,x,val);
}
while(BFS()) ans-=dfs(S,INF);
for(re int i=1;i<=n;i++) if(a[i]<0) ans+=a[i];
if(ans<0) puts("-1");
else std::cout<<ans;
return 0;
}
【[TJOI2010]电影迷】的更多相关文章
- 【刷题】洛谷 P3872 [TJOI2010]电影迷
题目描述 小A是一个电影迷,他收集了上百部的电影,打算从中挑出若干部在假期看完.他根据自己的口味和网上的介绍,对每部电影X都打了一个分数vX,表示自己喜欢的程度.这个分数的范围在-1000至1000之 ...
- python2.7高级编程 笔记二(Python中的描述符)
Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...
- 【python】描述符descriptor
开始看官方文档,各种看不懂,只看到一句Properties, bound and unbound methods, static methods, and class methods are all ...
- Python描述符(descriptor)解密(转)
原文:http://www.geekfan.net/7862/ Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装 ...
- Python-描述符
Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些“中级”的语 ...
- Sublime Text主题下载、安装与配置
从下面地址下载主题包,以下载第一个为例,解压缩并重命名为Theme – Flatland 备注:下载好的文件中 .sublime-theme后缀的表示界面主题(theme),.tmTheme表示颜色 ...
- 爬虫神器XPath,程序员带你免费获取周星驰等明星热门电影
本教程由"做全栈攻城狮"原创首发,本人大学生一枚平时还需要上课,但尽量每日更新文章教程.一方面把我所习得的知识分享出来,希望能对初学者有所帮助.另一方面总结自己所学,以备以后查看. ...
- 广告狂人第一至七季/全集Mad Men迅雷下载
广告狂人 第一季 Mad Men Season 1 (2007) 本季看点:你是谁?你想要什么?你爱乾什么?这些都不重要,重要的是你怎么把东西卖出去.凡是了解纽约的人都知道,今天,在麦迪逊大道(Mad ...
- Python描写叙述符(descriptor)解密
Python中包括了很多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...
随机推荐
- [javaSE] 数据结构(二叉查找树-插入节点)
二叉查找树(Binary Search Tree),又被称为二叉搜索树,它是特殊的二叉树,左子树的节点值小于右子树的节点值. 定义二叉查找树 定义二叉树BSTree,它保护了二叉树的根节点BSTNod ...
- 二:SpringCloud-Eureka
五:Eureka服务注册与发现 1. 是什么 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现==服务注册和发现==(请对比Zookeeper). Eureka ...
- java中接口的定义
使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] interface 接口名 [ ...
- 【SSH网上商城项目实战21】从Demo中看易宝支付的流程
转自: https://blog.csdn.net/eson_15/article/details/51447492 这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后, ...
- Node.js+websocket+mongodb实现即时聊天室
ChatRoom Node.js+websocket+mongodb实现即时聊天室 A,nodejs简介:Node.js是一个可以让javascript运行在服务器端的平台,它可以让javascrip ...
- python中单下划线和双下滑线
使用单下划线(_one_underline)开头表示方法不是API的一部分,不要直接访问(虽然语法上访问也没有什么问题). 使用双下划线开头(__two_underlines)开头表示子类不能覆写该方 ...
- BZOJ2187:fraction
Sol 分情况讨论 \(\lfloor\frac{a}{b}\rfloor+1\le \lceil\frac{c}{d}\rceil-1\) 直接取 \(q=1,p=\lfloor\frac{a}{b ...
- JQ的几组API辨析:
1.插入: Jq的插入一共有八个API可供选择,结果相类似,下面将以例子,简单明了的介绍下用法: <select name="one" multiple="mult ...
- Django—Form两种解决表单数据无法动态刷新的方法
一.无法动态更新数据的实例 1. 如下,数据库中创建了班级表和教师表,两张表的对应关系为“多对多” from django.db import models class Classes(models. ...
- Git简介、安装与配置
老规矩QAQ,先来简单介绍一下Git: Git是一个分布式版本控制系统,可以理解为是一个用于管理代码,控制版本,方便多人合作开发的一款工具. Git:分布式版本控制系统. SVN.CVS:集中式版本控 ...