题目链接

题意

每个人可以选择两种角色(A,B)(A, B)(A,B),给定MMM个关系(x,y)(x, y)(x,y),如果x,yx, yx,y同时选择AAA总的攻击力加aaa,如果x,yx, yx,y同时选择BBB总的攻击力加ccc,如果x,yx, yx,y分别选择A,BA,BA,B总的攻击力加ccc,求如何分配使得总的攻击力最大?

思路

转化为最小割模型,统计所有流量,构造使得最小割为多加的流量,边权扩大2倍,防止小数。
(来自题解)

设一条边的三种贡献为 A,B,CA,B,CA,B,C,可以得到以下方程:

a+b=A+Ba + b = A + Ba+b=A+B(x,yx, yx,y 都选 Mage)

c+d=C+Bc + d = C + Bc+d=C+B(x,yx, yx,y 都选 Warrior)

a+d+e=A+Ca + d + e = A + Ca+d+e=A+C(xxx 选 Mage, yyy 选 Warrior )

b+c+e=A+Cb + c + e = A + Cb+c+e=A+C(xxx 选 Warrior, yyy 选 Mage )

可得一组解 a=b=(A+B)/2,c=d=(C+B)/2,e=−B+(A+C)/2a = b =(A + B)/ 2, c = d = (C + B) / 2, e = -B + (A + C) / 2a=b=(A+B)/2,c=d=(C+B)/2,e=−B+(A+C)/2 ,然后将所有有关系的两点的图合并,用所有贡献减掉这个图的最小割即可。

#include <bits/stdc++.h>
#define endl '\n'
const int maxn = 5e2 + 5;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
using namespace std;
struct Dinic{struct ac{int v, c, nex;}edge[maxn << 7]; // 根据题目要求计算int s, e;int head[maxn], dis[maxn], curedge[maxn], cnt;void init() {cnt = 0;memset(head, -1, sizeof(head));}void add(int u, int v, int c) {// 正向建边edge[cnt] = {v, c, head[u]};head[u] = cnt++;// 反向建边, 流量为0edge[cnt] = {u, 0, head[v]};head[v] = cnt++;}bool bfs() {queue<int> que;que.push(s);memset(dis, 0, sizeof(dis)); // 对图进行分层dis[s] = 1;while (!que.empty()) {int u = que.front();que.pop();for (int i = head[u]; i != -1; i = edge[i].nex) {int v = edge[i].v;int c = edge[i].c;// 如果节点v已经分过层或者u->v流量为0, continueif (dis[v] || c == 0) continue;dis[v] = dis[u] + 1; // 对v进行标记并加入队列que.push(v);}}return dis[e] > 0;  // 判断是否存在增广路,s是否能到达e}int dfs(int u, int flow) { // 增广路走到u点的最小流量为flowif (u == e || flow == 0) return flow;// 遍历u的所有出边for (int &i = curedge[u]; i != -1; i = edge[i].nex) { // 当前弧优化int v = edge[i].v;int c = edge[i].c;// 判断能否u->v增广if (dis[v] != dis[u] + 1 || c == 0) continue;int d = dfs(v, min(flow, c));if (d > 0) { // 找到一条增广路,修改增广路上的正反向边edge[i].c -= d;edge[i^1].c += d;return d;}            }dis[u] = -1; // // 炸点优化return 0;}long long dinic() {long long sum = 0, d;while (bfs()) { // 判读是否存在增广路for (int i = 0; i <= e; ++i) curedge[i] = head[i]; // copy head数组,在dfs中可以直接得到下一条没有被增广过的边while ((d = dfs(s, inf)) > 0) sum += d; // 多次dfs找增广路}return sum;}
}D;
int L[maxn], R[maxn];
int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m, s, e;while (scanf("%d %d", &n, &m) != EOF) {D.s = s = 0, D.e = e = n + 1;D.init();int u, v, a, b, c;long long ans = 0;fill(L, L+n+1, 0);fill(R, R+n+1, 0);for (int i = 0; i < m; ++i) {scanf("%d %d %d %d %d", &u, &v, &a, &b, &c);ans += a + b + c;D.add(u, v, a + c - 2*b);D.add(v, u, a + c - 2*b);L[u] += b + c;L[v] += b + c;R[u] += a + b;R[v] += a + b;}for (int i = 1; i <= n; ++i) {D.add(s, i, L[i]);D.add(i, e, R[i]);}ans = ans * 2 - D.dinic();printf("%lld\n", ans / 2);}return 0;
}

HDU - 6598 Harmonious Army (最小割)相关推荐

  1. HDU - 6598 Harmonious Army(最大流最小割)

    题目链接:点击查看 题目大意:现在有 n 个士兵,每个士兵有两种职业可以选择,一种是战士,一种是法师,现在有 m 对关系,每对关系 ( x , y ) 的权值如下: 如果 x 和 y 同为战士,则收益 ...

  2. hdu 4859 海岸线【最小割---------Dinic】

    海岸线 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  3. 【HDU】4859海岸线-最小割最大独立点权变形

    hdu4859 题解 在矩形外围一圈D,将所有相邻格子连边,海岸线相当于相连的两个格子种类不同的边的数量. 如果是最小化边数就是很经典的最小割模板了,考虑将最大化问题转成最小化相连的两个格子种类相同的 ...

  4. 网络流 最大流 最小割 费用流

    [腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...

  5. hdu 3046(最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3046 思路:最小割的入门题,设源点为0,汇点为n*m+1,源点与点为2的连一天容量为inf的边,汇点与 ...

  6. 【HDU - 5889】Barricade(最短路+网络流,最小割)

    题干: The empire is under attack again. The general of empire is planning to defend his castle. The la ...

  7. 【HDU】4859 海岸线 黑白染色+最小割

    传送门:[HDU]4859 题目分析: 最小割的思想真是博大精深! 本题的模型是最小割. 我们需要最大化海岸线的长度,如果相邻两点属性不同才会存在海岸线(海和陆地),所以我们可以将题目转化成最小化不是 ...

  8. HDU 4859 海岸线 最小割

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 题解: 这题考察的是最小割. 我们可以这样想:海岸线的长短变化都是E引起的,我们通过把'E'变 ...

  9. 【最小割】HDU 3987 Harry Potter and the Forbidden Forest

    得到的最小割得到sum sum/E 为 最小割 sum%E 为最小割的边数 #include <stdio.h> #include <string.h> #include &l ...

最新文章

  1. jetty作为内嵌服务器自启动
  2. 【BZOJ1003】物流运输
  3. 参加第三届信息化创新克拉玛依国际学术论坛
  4. idea中将java项目中的单个类打包成jar包
  5. 在Simulink中调整增益映射 Tune Gain Schedules in Simulink
  6. JSP中文件上传的关键步骤
  7. jQuery 左侧滑动
  8. java多肽跟重载_Java多态vs重写vs重载
  9. 2022年GPS广播星历精密星历如何下载
  10. Maven中的dependencyManagement
  11. 射频放大电路的优化及ADS仿真
  12. 什么是EasyUI,如何使用EasyUI?--easyui的十二种用法
  13. vue简单购物车结算计算总价
  14. 微信小程序-多层饼图/包含关系饼图/自定义饼图关系模式
  15. QGIS加载无偏移卫星地图URL
  16. 工业物联网解决方案:该如何打造智能工厂
  17. IE无法查看源文件原因及解决办法
  18. 【转】世上万事,不过是一懒二拖三不读书
  19. python pandas库详解_Pandas 库的详解和使用补充
  20. java中类变量的特点_已正确定义JavaBean中boolean类型的成员变量published,则符合JavaBean特点的方法是选项( )。...

热门文章

  1. django分页功能
  2. Mellanox 8亿美元收购EZchip
  3. IOS开发学习笔记011-xcode使用技巧
  4. Android窗口管理服务WindowManagerService切换Activity窗口(App Transition)的过程分析
  5. 可爱妈妈对我的\情色\教育
  6. python_异常处理
  7. [Python人工智能] 二十九.什么是生成对抗网络GAN?基础原理和代码普及(1)
  8. iOS GPUImage之视频采集GPUImageVideoCamera
  9. iOS之常用的方法和技巧
  10. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - A. 奖券数目