题意:有n个人,每个人可以从A,B两种职业中选择一种

有m对两人组,如果两个人都是A能获得p的收益,一个A一个B能获得q的收益,都是B能获得r的收益,其中q=p/4+r/3,保证p%4=0,r%3=0

求最大总收益

n<=5e2,m<=1e4,p,q,r<=4e6

思路:主要是建图

求得一组等效解,答案即为所有边权之和减去最小割

S出发到i的流量总数和i出发到T的流量总数可以累加一下最后再加这两种边,边数可以少一点

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned int uint;
  5. typedef unsigned long long ull;
  6. typedef pair<int,int> PII;
  7. typedef pair<ll,ll> Pll;
  8. typedef vector<int> VI;
  9. typedef vector<PII> VII;
  10. typedef pair<ll,ll>P;
  11. #define N 100010
  12. #define M 200010
  13. #define fi first
  14. #define se second
  15. #define MP make_pair
  16. #define pi acos(-1)
  17. #define mem(a,b) memset(a,b,sizeof(a))
  18. #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
  19. #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
  20. #define lowbit(x) x&(-x)
  21. #define Rand (rand()*(1<<16)+rand())
  22. #define id(x) ((x)<=B?(x):m-n/(x)+1)
  23. #define ls p<<1
  24. #define rs p<<1|1
  25.  
  26. const ll MOD=1e9+,inv2=(MOD+)/;
  27. double eps=1e-;
  28. ll INF=1ll<<;
  29. ll inf=5e13;
  30. int dx[]={-,,,};
  31. int dy[]={,,-,};
  32.  
  33. int head[N],vet[N],nxt[N],dis[N],gap[N],fan[N],s,S,T,tot;
  34. ll a[N][];
  35. double len[N];
  36.  
  37. int read()
  38. {
  39. int v=,f=;
  40. char c=getchar();
  41. while(c<||<c) {if(c=='-') f=-; c=getchar();}
  42. while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
  43. return v*f;
  44. }
  45.  
  46. void add(int a,int b,double c)
  47. {
  48. nxt[++tot]=head[a];
  49. vet[tot]=b;
  50. len[tot]=c;
  51. head[a]=tot;
  52.  
  53. nxt[++tot]=head[b];
  54. vet[tot]=a;
  55. len[tot]=;
  56. head[b]=tot;
  57. }
  58.  
  59. double dfs(int u,double aug)
  60. {
  61. if(u==T) return aug;
  62. int e=head[u],val=s-;
  63. double flow=;
  64. while(e)
  65. {
  66. int v=vet[e];
  67. if(len[e])
  68. {
  69. if(dis[u]==dis[v]+)
  70. {
  71. double t=dfs(v,min(len[e],aug-flow));
  72. len[e]-=t;
  73. len[fan[e]]+=t;
  74. flow+=t;
  75. if(dis[S]>=s) return flow;
  76. if(aug==flow) break;
  77. }
  78. val=min(val,dis[v]);
  79. }
  80. e=nxt[e];
  81. }
  82. if(!flow)
  83. {
  84. gap[dis[u]]--;
  85. if(!gap[dis[u]]) dis[S]=s;
  86. dis[u]=val+;
  87. gap[dis[u]]++;
  88. }
  89. return flow;
  90. }
  91.  
  92. double maxflow()
  93. {
  94. rep(i,,s) gap[i]=dis[i]=;
  95. gap[]=s;
  96. double ans=;
  97. while(dis[S]<s) ans+=dfs(S,INF);
  98. return ans;
  99. }
  100.  
  101. int main()
  102. {
  103. rep(i,,N-)
  104. if(i&) fan[i]=i+;
  105. else fan[i]=i-;
  106. int n,m;
  107. while(scanf("%d%d",&n,&m)!=EOF)
  108. {
  109. s=n;
  110. S=++s; T=++s;
  111. tot=;
  112. rep(i,,s) head[i]=;
  113. rep(i,,n) a[i][]=a[i][]=;
  114. ll ans=;
  115. rep(i,,m)
  116. {
  117. int x=read(),y=read(),p=read(),q=read(),r=read();
  118. a[x][]+=p+q;
  119. a[y][]+=p+q;
  120. a[x][]+=q+r;
  121. a[y][]+=q+r;
  122. add(x,y,(p+r-*q)/2.0);
  123. add(y,x,(p+r-*q)/2.0);
  124. ans+=p+q+r;
  125. }
  126. rep(i,,n)
  127. {
  128. add(S,i,a[i][]/2.0);
  129. add(i,T,a[i][]/2.0);
  130. }
  131. ans=(ll)ans-maxflow();
  132. printf("%I64d\n",ans);
  133. }
  134.  
  135. return ;
  136. }

【HDOJ6598】Harmonious Army(最小割)的更多相关文章

  1. [2019杭电多校第二场][hdu6598]Harmonious Army(最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6598 题意是说一个军队有n人,你可以给他们每个人安排战士或者法师的职业,有m对人有组合技,组合技的信息 ...

  2. hdu多校第二场1008(hdu6598) Harmonious Army 最小割

    题意: 一个军队有n人,你可以给他们每个人安排战士或者法师的职业,有m对人有组合技,组合技的信息是a,b,c,代表如果这两个人是两个战士,则组合技威力为a,一个战士一个法师,威力为b,其中b=a/4+ ...

  3. 2019 Multi-University Training Contest 2 Harmonious Army(最小割)

    题意:给你n个点 每个点都有两种选择 成为战士或者法师 现在给你m个关系 对应这两个人的对应关系的权值A,B,C 思路:按照下面的思路建图跑最小割(要注意权值要乘2 可能存在不整除的情况) #incl ...

  4. Hdu 6598 Harmonious Army 最小割

    N个人 每个人可以是战士/法师  M个组合 每个组合两个人 同是战士+a 同是法师+c 否则+b 对于每一个u,v,a,b,c 建(S,u,a) (u,v,a+c-2*b) (v,T,c) (S,v, ...

  5. 2019HDU多校赛第二场 H HDU 6598 Harmonious Army(最小割模型)

    参考博客https://blog.csdn.net/u013534123/article/details/97142191 #include<bits/stdc++.h> using na ...

  6. 2019 HDU 多校赛第二场 HDU 6598 Harmonious Army 构造最小割模型

    题意: 有n个士兵,你可以选择让它成为战士还是法师. 有m对关系,u和v 如果同时为战士那么你可以获得a的权值 如果同时为法师,你可以获得c的权值, 如果一个为战士一个是法师,你可以获得b的权值 问你 ...

  7. HDU(2485),最小割最大流

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2485 Destroying the bus stations Time Limit: 40 ...

  8. HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  9. hdu-5889-最短路+网络流/最小割

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

随机推荐

  1. ping, telnet, tcping 命令使用及对比

    1. ping 命令 ping 命令只能检查 IP 的连通性或网络连接速度,无法具体到某个端口. ping 命令使用 ICMP 协议,跟 IP 协议属于同一层次(网络层).ping 命令在每次发数据包 ...

  2. ucenter 验证码看不到的解决办法

    ucenter 验证码看不到的解决办法,很简单,很实用,本人亲试成功~http://www.jinyuanbao.cn 把images /fonts /en 的ttf 刪除可以了!

  3. Xpath表达式的粗介绍

    关于在自动化中Xpath表达式的书写,其实我也只是刚刚入门,粗略的跟着网上的教程学了一下,这篇我就来分享总结一下我学习到的知识. 首先呢,我们先认识一下什么是Xpath.Xpath是XML路径语言,它 ...

  4. 学习:多项式算法----FFT

    FFT,即快速傅里叶变换,是离散傅里叶变换的快速方法,可以在很低复杂度内解决多项式乘积的问题(两个序列的卷积) 卷积 卷积通俗来说就一个公式(本人觉得卷积不重要) $$C_k=\sum_{i+j=k} ...

  5. PA动画使用教程

    1.动画复制与动画粘贴.动画删除 PA的动画复制.动画粘贴不会覆盖原有动画: PPT自带的动画刷会覆盖原有动画: 注意: 超级属性的动画复制.粘贴有bug,应使用自带的动画刷: PA动画的复制.粘贴只 ...

  6. python-生成式的基本使用

    生成式是python中的一种高级玩法,起码看起来显得要高级一点.它可以使用简单的一行代码实现列表.字典等数据类型的创建或数据类型的转换等任务.另外,它和生成器还有些许关联. 列表生成式 列表生成式即生 ...

  7. 机器学习 coursera_ML

    在开始看之前,浏览器一直出现缓冲问题,是配置文件设置的不对,最后搞定,高兴!解决方法如下: 1.到C:\Windows\System32\drivers\etc下找到host文件,并以文本方式打开, ...

  8. LeetCode #237. Delete Node in a Linked List 删除链表中的节点

    https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ 非常巧妙的一道题. 题目没有给head,心想没有head我怎么才能找到要删 ...

  9. flex布局解说和属性

    1. flex-direction 规定当前DIV下面的子元素是横向布局还是纵向布局 row 默认值,横向布局相当于float:left column 纵向,相当于DIV默认的垂直方向 2.justi ...

  10. SQL 日期格式化与格式转化

    日期格式化 Select CONVERT(varchar(), GETDATE(), ): :57AM Select CONVERT(varchar(), GETDATE(), ): // Selec ...