题目描述

小A是一个电影迷,他收集了上百部的电影,打算从中挑出若干部在假期看完。他根据自己的口味和网上的介绍,对每部电影X都打了一个分数vX,表示自己喜欢的程度。这个分数的范围在-1000至1000之间,越大表示越喜欢。小A每看一部电影X,他的体验值就会加上vX。

另外,因为某些电影是组成一个系列的,比如著名的《终结者》系列、《黑客帝国》系列等等,如果小A只看了前一部而没有看后一部的话,他就会觉得不是很爽。准确来讲,对于任意两部不同的电影X,Y,他们可能存在一个依赖值dXY,表示如果小A看了X但是没看Y,他的体验值就会减少dXY。(注意与观看的顺序无关,只要两部都看过,就不会减少体验值)

现在他要选出若干电影来看,使得得到的总的体验值最大。如果他无法得到正的体验值,就输出0。

输入输出格式

输入格式:

输入的第一行是两个整数:电影总数N和依赖关系数目M。第二行包含用空格隔开的N个数,表示对每部电影的打分。接下来M行,每行包含三个整数X, Y, dXY,表示一个依赖关系。每个有序对(X,Y)最多出现一次。(1 ≤ X,Y ≤ N)

输出格式:

输出一个整数,表示小A能得到的最大体验值。

输入输出样例

输入样例#1:

2 2

100 -50

1 2 49

2 1 10

输出样例#1:

51

说明

如果小A只看电影1,体验值为100-49 = 51。如果只看电影2,体验值为-50-10 = -60。如果两部都看,体验值为100+(-50) = 50。所以应该只看电影1。

数据规模与约定

对于20%的数据,1 ≤ N ≤ 15

对于100%的数据,1 ≤ N ≤ 100, -1000 ≤ vX ≤ 1000, 0 < dXY ≤ 1000

每个测试点时限1秒

题解

最大权闭合子图模板题

先强行看所有正权值的电影,即源点向所有正权值的点连边,边权为点的权值

强制不看负权值的电影,即所有负权值的点向汇点连边,边权为点的权值的相反数

中间的限制关系,两两连边,权值就为减少的值的绝对值

那么考虑割开整个图,与源点相连的就是要看的,与汇点相连的就是不看的

那么割的代价就是所有正权值的和需要减少的

我们要最后的答案最大,于是割要最小

跑最小割,用正权值的和减去代价即为答案

  1. #include<bits/stdc++.h>
  2. #define ui unsigned int
  3. #define ll long long
  4. #define db double
  5. #define ld long double
  6. #define ull unsigned long long
  7. const int MAXN=100+10,MAXM=MAXN*MAXN+10,inf=0x3f3f3f3f;
  8. int n,m,e=1,beg[MAXN],cur[MAXN],vis[MAXN],clk,s,t,ans,level[MAXN],to[MAXM<<1],nex[MAXM<<1],cap[MAXM<<1];
  9. std::queue<int> q;
  10. template<typename T> inline void read(T &x)
  11. {
  12. T data=0,w=1;
  13. char ch=0;
  14. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  15. if(ch=='-')w=-1,ch=getchar();
  16. while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
  17. x=data*w;
  18. }
  19. template<typename T> inline void write(T x,char ch='\0')
  20. {
  21. if(x<0)putchar('-'),x=-x;
  22. if(x>9)write(x/10);
  23. putchar(x%10+'0');
  24. if(ch!='\0')putchar(ch);
  25. }
  26. template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
  27. template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
  28. template<typename T> inline T min(T x,T y){return x<y?x:y;}
  29. template<typename T> inline T max(T x,T y){return x>y?x:y;}
  30. inline void insert(int x,int y,int z)
  31. {
  32. to[++e]=y;
  33. nex[e]=beg[x];
  34. beg[x]=e;
  35. cap[e]=z;
  36. to[++e]=x;
  37. nex[e]=beg[y];
  38. beg[y]=e;
  39. cap[e]=0;
  40. }
  41. inline bool bfs()
  42. {
  43. memset(level,0,sizeof(level));
  44. level[s]=1;
  45. q.push(s);
  46. while(!q.empty())
  47. {
  48. int x=q.front();
  49. q.pop();
  50. for(register int i=beg[x];i;i=nex[i])
  51. if(cap[i]&&!level[to[i]])level[to[i]]=level[x]+1,q.push(to[i]);
  52. }
  53. return level[t];
  54. }
  55. inline int dfs(int x,int maxflow)
  56. {
  57. if(x==t||!maxflow)return maxflow;
  58. vis[x]=clk;
  59. int res=0;
  60. for(register int &i=cur[x];i;i=nex[i])
  61. if((vis[to[i]]^vis[x])&&cap[i]&&level[to[i]]==level[x]+1)
  62. {
  63. int f=dfs(to[i],min(cap[i],maxflow));
  64. res+=f;
  65. cap[i]-=f;
  66. cap[i^1]+=f;
  67. maxflow-=f;
  68. if(!maxflow)break;
  69. }
  70. return res;
  71. }
  72. inline int Dinic()
  73. {
  74. int res=0;
  75. while(bfs())clk++,memcpy(cur,beg,sizeof(cur)),res+=dfs(s,inf);
  76. return res;
  77. }
  78. int main()
  79. {
  80. read(n);read(m);
  81. s=n+1,t=s+1;
  82. for(register int i=1;i<=n;++i)
  83. {
  84. int x;read(x);
  85. if(x>=0)ans+=x,insert(s,i,x);
  86. else insert(i,t,-x);
  87. }
  88. for(register int i=1;i<=m;++i)
  89. {
  90. int u,v,k;read(u);read(v);read(k);
  91. insert(u,v,k);
  92. }
  93. write(ans-Dinic(),'\n');
  94. return 0;
  95. }

【刷题】洛谷 P3872 [TJOI2010]电影迷的更多相关文章

  1. 2018.10.30 一题 洛谷4660/bzoj1168 [BalticOI 2008]手套——思路!问题转化与抽象!+单调栈

    题目:https://www.luogu.org/problemnew/show/P4660 https://www.lydsy.com/JudgeOnline/problem.php?id=1168 ...

  2. 洛谷——P3871 [TJOI2010]中位数

    P3871 [TJOI2010]中位数 一眼秒掉,这不是splay水题吗,套模板 #include<bits/stdc++.h> #define IL inline #define N 1 ...

  3. 洛谷 P3871 [TJOI2010]中位数 解题报告

    P3871 [TJOI2010]中位数 题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前 ...

  4. AC日记——大爷的字符串题 洛谷 P3709

    大爷的字符串题 思路: 莫队,需开O2,不开50: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20000 ...

  5. 洛谷P3871 [TJOI2010]中位数(splay)

    题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...

  6. Mychael原创题 洛谷T23923 Mychaelの水题 【题解】

    原题链接 题目大意: 有来自三个地区的人各a,b,c位,他们排成了一排.请问有多少种不同类型的排法,使得相邻的人都来自不同的地区 \(a,b,c<=200\) 答案取模 题解 弱弱的标程解法 设 ...

  7. 洛谷 P3879 [TJOI2010]阅读理解

    P3879 [TJOI2010]阅读理解 题目描述 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输入输出 ...

  8. 洛谷 3871 [TJOI2010]中位数

    [题解] 平衡树模板题,不过因为可以离线,所以有别的做法.把询问倒着做,变成删掉数字.求中位数,于是可以二分+树状数组. #include<cstdio> #include<cstr ...

  9. 洛谷3871 [TJOI2010]中位数 维护队列的中位数

    题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...

随机推荐

  1. 【Jmeter测试】接口请求完成后,查询数据库结果,检测数据存储是否正确

    Jmeter脚本逻辑 发送POST请求,把数据保存到数据库中 发讯数据库,数据库查询结果保存的变量中 使用BeanShell判断数据库查询结果 Jmeter脚本结构 第一个箭头指的是JDBC Conn ...

  2. Linux(centos7)之更换安装python3(二)

    Linux不比window好安装python,折腾了好久,终于成功安装上了python,window上一个安装包完事,可惜Linux上python版本太低不好使,还要更换为3版本,百度了好久,教程上总 ...

  3. WebStorm微信小程序单位rpx出现空格问题

    Windows先下载sed 配置Tools->File Watchers->+ 添加下图配置 //windows系统 -i s/"\ rpx"/rpx/g $FileP ...

  4. 单纯形法MATALAB实现

    参考单纯形法的步骤,MATALAB中的实现如下(求极小值): 注:对于极大值的求解,只需要对目标函数添加负号,求解出来的\(X\),再带入原目标函数即可. function [ X, z ] = si ...

  5. dom学习要点

    Dom操作 1.文本内容操作 - innerText:操作文本 - innerHtml:操作全内容 //innerText标签: <div id='i2' ><a>土味程序员& ...

  6. 苏宁笔试:UML类图中的关系

    1. 依赖 2. 关联 3. 聚合 4. 组合 5. 泛化 6. 实现

  7. Navicat将oracle中数据复制到mysql

    1,首先两个数据库都要处于连接状态 2,工具 -- 数据传输 3,选择来源数据库以及要传输的表和目标数据库 4,点击开始 PS:遇到一个问题:[Err] [Dtf] 1426 - Too-big pr ...

  8. 事后分析报告(Postmortem Report)要求

    在得到M1 团队成绩之后, 每个团队都需要编写一个事后分析报告,对于团队在M1阶段的工作做一个总结. 请根据下面的模板总结并发表博客: http://www.cnblogs.com/xinz/arch ...

  9. 20172319 2018.04.01-04.11 《Java程序设计》第5周学习总结

    20172319 2018.04.01-04.11 <Java程序设计>第5周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错 ...

  10. 《Spring2之站立会议1》

    <Spring2之站立会议1> 昨天,查找了关于建立起服务器和客户端两端的连接的资料,并学习了如何写把两者建立起来的代码: 今天,模仿着相关资料,分别写了客户端和服务器两端的代码: 遇到的 ...