【HDOJ6598】Harmonious Army(最小割)
题意:有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的流量总数可以累加一下最后再加这两种边,边数可以少一点
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned int uint;
- typedef unsigned long long ull;
- typedef pair<int,int> PII;
- typedef pair<ll,ll> Pll;
- typedef vector<int> VI;
- typedef vector<PII> VII;
- typedef pair<ll,ll>P;
- #define N 100010
- #define M 200010
- #define fi first
- #define se second
- #define MP make_pair
- #define pi acos(-1)
- #define mem(a,b) memset(a,b,sizeof(a))
- #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
- #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
- #define lowbit(x) x&(-x)
- #define Rand (rand()*(1<<16)+rand())
- #define id(x) ((x)<=B?(x):m-n/(x)+1)
- #define ls p<<1
- #define rs p<<1|1
- const ll MOD=1e9+,inv2=(MOD+)/;
- double eps=1e-;
- ll INF=1ll<<;
- ll inf=5e13;
- int dx[]={-,,,};
- int dy[]={,,-,};
- int head[N],vet[N],nxt[N],dis[N],gap[N],fan[N],s,S,T,tot;
- ll a[N][];
- double len[N];
- int read()
- {
- int v=,f=;
- char c=getchar();
- while(c<||<c) {if(c=='-') f=-; c=getchar();}
- while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
- return v*f;
- }
- void add(int a,int b,double c)
- {
- nxt[++tot]=head[a];
- vet[tot]=b;
- len[tot]=c;
- head[a]=tot;
- nxt[++tot]=head[b];
- vet[tot]=a;
- len[tot]=;
- head[b]=tot;
- }
- double dfs(int u,double aug)
- {
- if(u==T) return aug;
- int e=head[u],val=s-;
- double flow=;
- while(e)
- {
- int v=vet[e];
- if(len[e])
- {
- if(dis[u]==dis[v]+)
- {
- double t=dfs(v,min(len[e],aug-flow));
- len[e]-=t;
- len[fan[e]]+=t;
- flow+=t;
- if(dis[S]>=s) return flow;
- if(aug==flow) break;
- }
- val=min(val,dis[v]);
- }
- e=nxt[e];
- }
- if(!flow)
- {
- gap[dis[u]]--;
- if(!gap[dis[u]]) dis[S]=s;
- dis[u]=val+;
- gap[dis[u]]++;
- }
- return flow;
- }
- double maxflow()
- {
- rep(i,,s) gap[i]=dis[i]=;
- gap[]=s;
- double ans=;
- while(dis[S]<s) ans+=dfs(S,INF);
- return ans;
- }
- int main()
- {
- rep(i,,N-)
- if(i&) fan[i]=i+;
- else fan[i]=i-;
- int n,m;
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- s=n;
- S=++s; T=++s;
- tot=;
- rep(i,,s) head[i]=;
- rep(i,,n) a[i][]=a[i][]=;
- ll ans=;
- rep(i,,m)
- {
- int x=read(),y=read(),p=read(),q=read(),r=read();
- a[x][]+=p+q;
- a[y][]+=p+q;
- a[x][]+=q+r;
- a[y][]+=q+r;
- add(x,y,(p+r-*q)/2.0);
- add(y,x,(p+r-*q)/2.0);
- ans+=p+q+r;
- }
- rep(i,,n)
- {
- add(S,i,a[i][]/2.0);
- add(i,T,a[i][]/2.0);
- }
- ans=(ll)ans-maxflow();
- printf("%I64d\n",ans);
- }
- return ;
- }
【HDOJ6598】Harmonious Army(最小割)的更多相关文章
- [2019杭电多校第二场][hdu6598]Harmonious Army(最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6598 题意是说一个军队有n人,你可以给他们每个人安排战士或者法师的职业,有m对人有组合技,组合技的信息 ...
- hdu多校第二场1008(hdu6598) Harmonious Army 最小割
题意: 一个军队有n人,你可以给他们每个人安排战士或者法师的职业,有m对人有组合技,组合技的信息是a,b,c,代表如果这两个人是两个战士,则组合技威力为a,一个战士一个法师,威力为b,其中b=a/4+ ...
- 2019 Multi-University Training Contest 2 Harmonious Army(最小割)
题意:给你n个点 每个点都有两种选择 成为战士或者法师 现在给你m个关系 对应这两个人的对应关系的权值A,B,C 思路:按照下面的思路建图跑最小割(要注意权值要乘2 可能存在不整除的情况) #incl ...
- 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, ...
- 2019HDU多校赛第二场 H HDU 6598 Harmonious Army(最小割模型)
参考博客https://blog.csdn.net/u013534123/article/details/97142191 #include<bits/stdc++.h> using na ...
- 2019 HDU 多校赛第二场 HDU 6598 Harmonious Army 构造最小割模型
题意: 有n个士兵,你可以选择让它成为战士还是法师. 有m对关系,u和v 如果同时为战士那么你可以获得a的权值 如果同时为法师,你可以获得c的权值, 如果一个为战士一个是法师,你可以获得b的权值 问你 ...
- HDU(2485),最小割最大流
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2485 Destroying the bus stations Time Limit: 40 ...
- 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 ...
- hdu-5889-最短路+网络流/最小割
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
随机推荐
- ping, telnet, tcping 命令使用及对比
1. ping 命令 ping 命令只能检查 IP 的连通性或网络连接速度,无法具体到某个端口. ping 命令使用 ICMP 协议,跟 IP 协议属于同一层次(网络层).ping 命令在每次发数据包 ...
- ucenter 验证码看不到的解决办法
ucenter 验证码看不到的解决办法,很简单,很实用,本人亲试成功~http://www.jinyuanbao.cn 把images /fonts /en 的ttf 刪除可以了!
- Xpath表达式的粗介绍
关于在自动化中Xpath表达式的书写,其实我也只是刚刚入门,粗略的跟着网上的教程学了一下,这篇我就来分享总结一下我学习到的知识. 首先呢,我们先认识一下什么是Xpath.Xpath是XML路径语言,它 ...
- 学习:多项式算法----FFT
FFT,即快速傅里叶变换,是离散傅里叶变换的快速方法,可以在很低复杂度内解决多项式乘积的问题(两个序列的卷积) 卷积 卷积通俗来说就一个公式(本人觉得卷积不重要) $$C_k=\sum_{i+j=k} ...
- PA动画使用教程
1.动画复制与动画粘贴.动画删除 PA的动画复制.动画粘贴不会覆盖原有动画: PPT自带的动画刷会覆盖原有动画: 注意: 超级属性的动画复制.粘贴有bug,应使用自带的动画刷: PA动画的复制.粘贴只 ...
- python-生成式的基本使用
生成式是python中的一种高级玩法,起码看起来显得要高级一点.它可以使用简单的一行代码实现列表.字典等数据类型的创建或数据类型的转换等任务.另外,它和生成器还有些许关联. 列表生成式 列表生成式即生 ...
- 机器学习 coursera_ML
在开始看之前,浏览器一直出现缓冲问题,是配置文件设置的不对,最后搞定,高兴!解决方法如下: 1.到C:\Windows\System32\drivers\etc下找到host文件,并以文本方式打开, ...
- LeetCode #237. Delete Node in a Linked List 删除链表中的节点
https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ 非常巧妙的一道题. 题目没有给head,心想没有head我怎么才能找到要删 ...
- flex布局解说和属性
1. flex-direction 规定当前DIV下面的子元素是横向布局还是纵向布局 row 默认值,横向布局相当于float:left column 纵向,相当于DIV默认的垂直方向 2.justi ...
- SQL 日期格式化与格式转化
日期格式化 Select CONVERT(varchar(), GETDATE(), ): :57AM Select CONVERT(varchar(), GETDATE(), ): // Selec ...