题干:

链接:https://ac.nowcoder.com/acm/contest/369/F
来源:牛客网

题目描述

现在你有 n 把灵剑,其中选择第i把灵剑会得到的 wiw_iwi​ 攻击力。

于此同时,还有q个约束,每个约束形如:

x 和 y 表示两个物品的编号,如果同时选中可以获得额外 v0v_0v0​ 的攻击力, 同时不选可以获得额外 v1v_1v1​ 点攻击力,只选择一个则会扣除 v2v_2v2​ 的攻击力。

王小D想知道剑阵的最大攻击力。

九州大陆的未来,必有灵剑山的一笔!

输入描述:

 

第一行两个整数 n, q ,n表示灵剑数量,q表示约束数量。

接下来一行,共 n 个整数,第 i 个整数表示 wiw_iwi​。

接下来 q 行,每行五个整数,表示一个约束。

输出描述:

共一行,输出最大的攻击力。

示例1

输入

复制

5 2
4 2 6 6 2
4 2 4 2 2
5 1 6 6 4

输出

复制

30

说明

5把灵剑都选 ,获得4+2+6+6+2+4+6=30的攻击力

备注:

,且  均为偶数。

数据保证对于任一无序对(x,y)只会有一个约束。

解题报告:

还是看官方题解吧、、、但是注意构造的权值不能出现负数,也不知道为什么。(可能是因为不然不能放到网络流里面跑吧?)

另外注意这题不能直接上来就加st到i的边和i到ed的边,因为你这样的话w[i]会被计算多次,不符合定义式,因为你需要他只被选择一次的。

AC代码:

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#define ll long long
using namespace std;
int n,Q;
int tot;
struct Edge {int to,ne;ll w;
} e[100005 * 2];
int head[10005];
int st,ed;
int dis[10050],q[10005];//一共多少个点跑bfs,dis数组和q数组就开多大。
void add(int u,int v,ll w) {e[++tot].to=v; e[tot].w=w; e[tot].ne=head[u]; head[u]=tot;e[++tot].to=u; e[tot].w=0; e[tot].ne=head[v]; head[v]=tot;
}
bool bfs(int st,int ed) {memset(dis,-1,sizeof(dis));int front=0,tail=0;q[tail++]=st;dis[st]=0;while(front<tail) {int cur = q[front];if(cur == ed) return 1;front++;for(int i = head[cur]; i!=-1; i = e[i].ne) {if(e[i].w&&dis[e[i].to]<0) {q[tail++]=e[i].to;dis[e[i].to]=dis[cur]+1;}}}if(dis[ed]==-1) return 0;return 1;
}
ll dfs(int cur,ll limit) {//limit为源点到这个点的路径上的最小边权 if(limit==0||cur==ed) return limit;ll w,flow=0;for(int i = head[cur]; i!=-1; i = e[i].ne) {       if(e[i].w&&dis[e[i].to]==dis[cur]+1) {w=dfs(e[i].to,min(limit,e[i].w));e[i].w-=w;e[i^1].w+=w;flow+=w;limit-=w;if(limit==0) break;}}if(!flow) dis[cur]=-1;return flow;
}
ll dinic() {ll ans = 0;while(bfs(st,ed)) ans+=dfs(st,0x7fffffffff);return ans;
}
ll w[100005];
ll W[100005],W2[100005];
int main()
{int Q;cin>>n>>Q;st=n+1,ed=st+1; tot=1;for(int i = 0; i<=ed; i++) head[i] = -1;ll sum = 0,v0,v1,v2,a,b,c,d,e,f;int x,y;for(int i = 1; i<=n; i++) scanf("%lld",w+i),sum += w[i];while(Q--) {scanf("%d%d%lld%lld%lld",&x,&y,&v0,&v1,&v2);sum += v0+v1;a=b=v1/2;c=d=(v0+v1)/2+v2;f=v0/2;e=v0/2;W[x]+=a;W[y]+=b;W2[x]+=e;W2[y]+=f;//add(st,x,a); add(st,y,b); add(x,y,c); add(y,x,d); //add(x,ed,e); add(y,ed,f);}for(int i = 1; i<=n; i++) add(st,i,W[i]),add(i,ed,w[i]+W2[i]);printf("%lld\n",sum - dinic());                return 0;
}
/*
4 2
1 1 1 1
1 2 4 8 2
2 3 6 8 10
*/

不知道为什么还可以这样建图(贴一发别人的代码)(有空再研究吧)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e7 + 10;
int head[N], rest[N], to[N], flow[N], tot = 1;
void sig(int u, int v, int w) {to[++ tot] = v, flow[tot] = w, rest[tot] = head[u], head[u] = tot;
}
void add(int u, int v, int w) {sig(u, v, w), sig(v, u, 0);
}
int n, m, cnt, dis[N], S, T; ll ans;
int bfs() {for(int i = 1 ; i <= cnt ; ++ i) dis[i] = -1;queue<int> q;q.push(S), dis[S] = 1;while(q.size()) {int u = q.front(); q.pop();for(int i = head[u] ; i ; i = rest[i]) {int v = to[i];if(dis[v] == -1 && flow[i]) {dis[v] = dis[u] + 1;q.push(v);}}}return dis[T] != -1;
}
int dfs(int u, int f) {if(u == T || !f) return f;int use = 0;for(int i = head[u] ; i ; i = rest[i]) {int v = to[i];if(flow[i] && dis[v] == dis[u] + 1) {int a = dfs(v, min(f - use, flow[i]));flow[i] -= a, flow[i ^ 1] += a;use += a;if(use == f) break;}}if(!use) dis[u] = -1;return use;
}
int main() {scanf("%d%d", &n, &m);S = ++ cnt, T = ++ cnt;for(int i = 1, a, b ; i <= n ; ++ i) {scanf("%d", &b);a=0;int x = ++ cnt;add(S, x, a);add(x, T, b);ans += a + b;}for(int i = 1, u, v, a, b, c ; i <= m ; ++ i) {scanf("%d%d%d%d%d", &u, &v, &b, &a, &c);u += 2, v += 2;int x = ++ cnt, y = ++ cnt;add(S, x, a); add(x, u, a); add(x, v, a);add(u, y, b); add(v, y, b); add(y, T, b);add(u, v, c); add(v, u, c);ans += a + b;}while(bfs()) {ans -= dfs(S, 0x3f3f3f3f);}printf("%lld\n", ans);
}

【牛客 - 369F】小D的剑阵(最小割建图,二元关系建图,网络流最小割)相关推荐

  1. 牛客网-小周的曲射炮

    牛客网-小周的曲射炮(公式推导) 题目描述 小周最近在玩一款二战游戏,他因而对曲射炮的轨迹产生了很大的兴趣,但是在尝试计算后,小周发现这个问题并不是那么简单,他因而来请教你这位计算机高手,请你来帮帮他 ...

  2. 【牛客CMB2 小招喵跑步】

    牛客CMB2 小招喵跑步 题目 解题思路 代码实例 运行代码 题目 小招喵喜欢在数轴上跑来跑去,假设它现在站在点n处,它只会3种走法,分别是: 1.数轴上向前走一步,即n=n+1 2.数轴上向后走一步 ...

  3. 牛客网 - 小乐乐打游戏(BFS)

    链接:https://ac.nowcoder.com/acm/contest/301/G 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  4. 牛客网小bai月赛40

    牛客网小白月赛40 A 数字游戏 B 跳跳跳 D 优美字符串 E 分组 F 过桥 G 空调遥控 I 体操队形 牛客比赛页面跳转 这是一篇菜鸟的自我总结,大佬勿喷,轻点轻点~ A 数字游戏 题目意思: ...

  5. 牛客网 小睿睿的方案 解题报告

    小睿睿的方案 链接: https://ac.nowcoder.com/acm/contest/371/C 来源:牛客网 题目描述 小睿睿虽然已经是人生赢家了,但当他看见学校里其他人秀恩爱时仍旧会十分不 ...

  6. 刷题记录:牛客NC15162小H的询问

    传送门:牛客 题目描述: 小H给你一个数组{a},要求支持以下两种操作: 1. 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认 ...

  7. 牛客 NC201908 小睿睿的伤害(dsu on tree, 启发式合并)

    传送门 题目大意   给你一棵树,每个节点有一个权值valvalval,每一对点对(i,j)(i,j)(i,j) 可以在他们的lcalcalca处造成gcd(val[i],val[j])gcd(val ...

  8. 牛客网小白二(2018.4.21)

    需要加强的内容:1.递归(尼姆堆) 2.字符与字符串的输入输出,有关其求长度或个数的的函数.语法等 3.有向图.无向图.树的遍历 一.数字方阵 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/ ...

  9. 刷题记录:牛客NC14662小咪买东西NC15446wyh的物品

    传送门:小咪买东西 传送门:wyh的物品 这两道题的题目大致相似,解法也大抵相似(双倍经验!!),接下来主要讲解wyh的物品 题目描述: wyh学长现在手里有 n 个物品,这 n 个物品的重量和价值都 ...

最新文章

  1. linux命令注入,Linux kernel本地命令注入漏洞
  2. Android 解决Android的TextView和EditText换行问题
  3. unity 文本输入框_unity实战项目[我是食神黑长直]1星难度.含源码
  4. AS3中,setTimeOut、setInterval、Timer区别
  5. JAVA——自定义排序(实现Comparable接口)
  6. ORACLE10回收站-Recyclebin
  7. (读书随笔)接口和抽象类的一些区别总结
  8. 如何设置照片的高度没有滚条_基金定投选几只合适,如何设置止盈止损,有没有好的组合推荐?...
  9. linux的三大服务器,Linux三大重要事件
  10. 程序员:你为什么要离职?
  11. springMVC 项目在jboss7中配置应用自己的log4j
  12. Codeforces Round #476 (Div. 2) 题解
  13. ppt倒计时器制作方法
  14. [转] 教师的备课主要解决哪些问题?
  15. css 怎么让图片一直旋转
  16. Java虚拟机(JVM源码):编译OpenJDK源码
  17. 液晶显示器点屏方法步骤及参数表
  18. Caused by: io.netty.resolver.dns.DnsNameResolverTimeoutException: [/192.168.1.1:53] query via UDP ti
  19. 二叉树的堂兄弟节点993
  20. stm32按键FIFO的实现

热门文章

  1. Windows集群网络配置最佳做法
  2. 架构设计分布式数据结构与算法面试题
  3. pta - 1132 Cut Integer
  4. mysql安装条款_mysql 安装注意
  5. wxpython界面切换_Python图形界面开发—wxPython库的布局管理及页面切换
  6. mips汇编计算开方_读美国伊利诺伊理工大学计算机科学硕士能学到什么?
  7. 1466C. Canine poetry
  8. netlify支持php吗,hexo netlify 搭建简易博客
  9. mysql to mssql_MysqlToMsSql
  10. sap bom递归_SAP软件之化工行业特点01