[2019杭电多校第二场][hdu6598]Harmonious Army(最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6598
题意是说一个军队有n人,你可以给他们每个人安排战士或者法师的职业,有m对人有组合技,组合技的信息是A,B,C,代表如果这两个人是两个战士,则组合技威力为A,一个战士一个法师,威力为B,其中B=A/4+C/3,两个法师,威力为C,求最大的威力。
很网络流的题目,那就流呗XD
先考虑如果每个人可以选择两个职业,则威力为$sum=\sum_{i=1}^{n}(a[i]+b[i]+c[i])$
如果不能选择两个职业,则可以看成选择两个职业的答案减去网络中的最小割。
则我们向着最小割的方向思考。
然后我们先考虑连通性,即所有点连战士(看成源点)和法师(看成汇点),并且有关系的点相互连接。
然后看下面的图(s为源点,t为汇点,x,y为一对关系)

然后考虑权值:
如果x选择战士,y选择战士,则a+b=B+C(割掉B,C的威力)
如果x选择法师,y法师战士,则c+d=B+A(割掉A,B的威力)
如果x选择战士,y选择法师,则a+e+d=A+C(割掉A,C的威力)
如果x选择法师,y选择战士,则b+e+c=A+C(割掉A,C的威力)
然后可以得到一组解a=b=(A+B)/2,c=d=(C+B)/2,e=(A+C)/2-B。
然后就可以愉快的建图。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + ;
const ll inf = 1e18;
struct node {
int e, next;
double w;
}edge[maxn];
int head[maxn], len;
int d[maxn];
void init() {
memset(head, -, sizeof(head));
len = ;
}
void add(int s, int e, double w) {
edge[len].e = e;
edge[len].w = w;
edge[len].next = head[s];
head[s] = len++;
}
bool bfs(int s, int e) {
queue<int>q;
memset(d, , sizeof(d));
d[s] = ;
q.push(s);
while (!q.empty()) {
int x = q.front(); q.pop();
for (int i = head[x]; i != -; i = edge[i].next) {
int y = edge[i].e;
if (edge[i].w && !d[y]) {
d[y] = d[x] + ;
q.push(y);
}
}
}
return d[e];
}
double dfs(int x, int e, double limit) {
if (x == e)
return limit;
double add, ans = ;
for (int i = head[x]; i != -; i = edge[i].next) {
int y = edge[i].e;
if (d[y] == d[x] + && edge[i].w) {
add = dfs(y, e, min(edge[i].w, limit));
edge[i].w -= add;
edge[i ^ ].w += add;
ans += add;
limit -= add;
if (!limit)
break;
}
}
if (!ans)
d[x] = -;
return ans;
}
double dinic(int s, int e) {
double ans = ;
while (bfs(s, e))
ans += dfs(s, e, inf);
return ans;
}
int main() {
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
init();
int s = n + , t = n + ;
ll sum = ;
for (int i = ; i <= m; i++) {
ll x, y;
double a, b, c;
scanf("%lld%lld%lf%lf%lf", &x, &y, &a, &b, &c);
add(s, x, (a + b) / );
add(x, s, );
add(s, y, (a + b) / );
add(y, s, );
add(x, t, (b + c) / );
add(t, x, );
add(y, t, (b + c) / );
add(t, y, );
add(x, y, -b + (a + c) / );
add(y, x, );
add(y, x, -b + (a + c) / );
add(x, y, );
sum += a + b + c;
}
ll ans = round(sum - dinic(s, t));
printf("%lld\n", ans);
}
}
[2019杭电多校第二场][hdu6598]Harmonious Army(最小割)的更多相关文章
- 2019杭电多校第二场hdu6601 Keen On Everything But Triangle
Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...
- 2019杭电多校第二场hdu6602 Longest Subarray(线段树)
Longest Subarray 题目传送门 解题思路 本题求一个最大的子区间,满足区间内的数字要么出现次数大于等于k次,要么没出现过.给定区间内的数字范围是1~c. 如果r为右边界,对于一种数字x, ...
- [2019杭电多校第二场][hdu6602]Longest Subarray(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6602 题目大意为求最长的区间,满足C种数字在区间内要么不出现,要么出现的次数都不小于K. 大致的分析一 ...
- [2019杭电多校第二场][hdu6601]Keen On Everything But Triangle
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6601 题意是说用给定区间内的数字组成周长最大的三角形. 大致做法就是求区间第1大,第2大和第3大然后判 ...
- [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机&&hash)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6599 题目大意为求字符串S有多少个子串S[l,r]满足回文串的定义,并且S[l,(l+r)/2]也满足 ...
- 2019年杭电多校第二场 1008题Harmonious Army(HDU6598+最小割+建图)
题目链接 传送门 题意 有\(n\)个士兵,要你给他们分配职业.有\(m\)对关系,对于某一对关系\(u,v\),如果同为勇士则总能力增加\(a\),同法师则增加\(c\),一个勇士一个法师增加\(\ ...
- 2019年杭电多校第二场 1012题Longest Subarray(HDU6602+线段树)
题目链接 传送门 题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于\(K\). 思路 我们通过固定右端点考虑每个左端点的情况. 首先对于每个位置,我们用线段树来维护它作为\(C\)种元素 ...
- 2019年杭电多校第二场 1002题Beauty Of Unimodal Sequence(LIS+单调栈)
题目链接 传送门 思路 首先我们对\(a\)正反各跑一边\(LIS\),记录每个位置在前一半的\(LIS\)中应该放的位置\(ans1[i]\),后一半的位置\(ans2[i]\). 对于字典序最小的 ...
- 2018 Multi-University Training Contest 2 杭电多校第二场
开始逐渐习惯被多校虐orz 菜是原罪 1004 Game (hdoj 6312) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6312 虽然披着 ...
随机推荐
- linux 时区问题
1.java项目发现 服务器时间不正确,修改了服务器时间之后依然没解决. 2.java虚拟机的时区也需要设置:
- Django【第20篇】:Ajax
初始Ajax 一.Ajax准备知识:json 说起json,我们大家都了解,就是python中的json模块,那么json模块具体是什么呢?那我们现在详细的来说明一下 1.json(Javascrip ...
- shell之文本过滤(grep)
shell之文本过滤(grep) 分类: linux shell脚本学习2012-09-14 14:17 588人阅读 评论(0) 收藏 举报 shell正则表达式扩展工具存储 grep(全局正则表达 ...
- Codeforces 916B Jamie and Binary Sequence ( 模拟 && 思维 )
题意 : 给出一个数 n ,要求你用 k 个二的幂来组成这个数,要求输出这 k 个二的幂的指数,如果有多解情况则优先输出最大指数最小的那一个且要求按字典序输出,不存在则输出 No 分析 : 先来说一 ...
- 用二叉树进行排序 x (从小到大)
先输入n,表示拥有多少个数: 第二行输入1-n个数,然后开始排序 输出从小到大的排序. ----------------------------------------------代码~------- ...
- [CF1188B]Count Pairs 题解
前言 这道题目是道好题. 第一次div-2进前100,我太弱了. 题解 公式推导 我们观察这个式子. \[(a_i+a_j)(a_i^2+a_j^2)\equiv k \mod p\] 感觉少了点什么 ...
- sh_02_第2个Python程序
sh_02_第2个Python程序 print("hello")
- CCPC E Problem Buyer
题目描述 有一些区间,还有一些点. 问最小的k使得选出任意k个区间,每个点都可以匹配上区间,一个区间只能匹配一次. 题解 考虑对于每一个点,我们有\(x\)个区间包含它,那么答案的一个下界是\(n-x ...
- Maps.newHashMap 和 new HashMap的区别
区别: (1)Map<String, Object> result = new HashMap<String,Object>(); 这种是java原生API写法,需要你手动加泛 ...
- P3928奶酪
传送 今天早晨,神志不清的我决定拿头过这道题 终于在wa了6次之后过了 emm 明明都是一些细节自己却注意不到啊啊啊不能再颓了!!!!!!!!!!!! 好了回归正题 首先我们要开long long ...