【BZOJ-1449&2895】球队收益&球队预算 最小费用最大流
1449: [JSOI2009]球队收益
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 648 Solved: 364
[Submit][Status][Discuss]
Description

Input

Output
Sample Input
1 0 2 1
1 1 10 1
0 1 3 3
1 2
2 3
3 1
Sample Output
HINT

Source
2895: 球队预算
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 51 Solved: 50
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 0 2 1
1 1 10 1
0 1 3 3
1 2
2 3
3 1
Sample Output
Data Limit
对于20%的数据2<=n<=10,0<=m<=20
对于100%的数据2<=n<=5000,0<=m<=1000,0<=di<=ci<=10,0<=a[i],b[i]<=50.
HINT
Source
Solution
idea很好的建图,不能考虑直接建,而应该利用增量的思想
个人的想法是这样的:
源到各比赛连边,容量为1,费用为0
建每个球队分成两个,由个比赛连向两只球队a,b,再由a连b',b连a',分别表示a赢了这场比赛或b赢了这场比赛
然后由各个点i'连向汇容量为inf,费用为0
然后预处理出来已比完的比赛胜负的价值,加上最小费用即可;
思路是考虑一场比赛的胜负对于结果的贡献,从这场比赛结束后对结果的增量来考虑,但显然这种方法并不是很优,但理论上可A
那么同样的思想,换一种方法建图:
不妨先假设后面的M场比赛中双方都是输家,这样我们只要在模型中表示一方成为赢家即可。
此应该有一个初步的模型了:对于N支球队和M场比赛各建一个点,从源向每场比赛连流量1费用0的边,从比赛向参与这场比赛的两支队伍各连一条流量1费用0的边。剩下的就是队伍收益的费用表示了。
多赢一场比赛产生的收益。即(C*(w+1)^2+D*(l-1)^2)-(C*w^2+D*l^2)=2w*C-2l*D+C+D。对于第i支队伍,假设后M场中i参加的有x场,那么最初w=win,l=lose+x,之后每赢一场w++,l--。我们从第i支队伍的点向汇连x条边,分别代表第i支队伍赢了j场比赛时相对赢j-1场时收益的增量。由于增量一定越来越大(平方嘛),所以流量最先流过的一定是费用较小的边,即j最小的边。
-----by huzecong
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-')f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define maxn 5100+1100
#define maxm 100100
int n,m,ans,S,T,num[];
struct Teamnode{int win,lose,C,D;}team[];
struct Edgenode{int to,next,cap,cost,from;}edge[maxm];
int head[maxn],cnt=;
void add(int u,int v,int w,int c)
{cnt++;edge[cnt].from=u;edge[cnt].to=v;
edge[cnt].next=head[u];head[u]=cnt;
edge[cnt].cost=c;edge[cnt].cap=w;}
void insert(int u,int v,int w,int c){add(u,v,w,c);add(v,u,,-c);}
#define inf 0x7fffffff
int q[maxn],h,t; int dis[maxn];bool mark[maxn];
bool spfa()
{
memset(mark,,sizeof(mark));
for (int i=S; i<=T; i++) dis[i]=inf;
h=,t=;
q[]=T; mark[T]=; dis[T]=;
while (h<t)
{
int now=q[h++]; mark[now]=;
for (int i=head[now]; i; i=edge[i].next)
if (edge[i^].cap && dis[now]+edge[i^].cost<dis[edge[i].to])
{
dis[edge[i].to]=dis[now]+edge[i^].cost;
if (!mark[edge[i].to])
mark[edge[i].to]=,q[t++]=edge[i].to;
}
}
return dis[S]!=inf;
}
int dfs(int loc,int low)
{
mark[loc]=;
if (loc==T) return low;
int w,used=;
for (int i=head[loc]; i; i=edge[i].next)
if (!mark[edge[i].to] && edge[i].cap && dis[edge[i].to]==dis[loc]-edge[i].cost)
{
w=dfs(edge[i].to,min(low-used,edge[i].cap));
edge[i].cap-=w; edge[i^].cap+=w;
ans+=w*edge[i].cost; used+=w;
if (used==low) return low;
}
return used;
}
int zkw()
{
int tmp=;
while (spfa())
{
mark[T]=;
while (mark[T])
{
memset(mark,,sizeof(mark));
tmp+=dfs(S,inf);
}
}
return tmp;
}
int power(int x){return x*x;}
void build()
{
S=,T=n+m+;
for(int a,b,i=; i<=m; i++)
insert(S,i,,),
a=read(),b=read(),
insert(i,a+m,,),insert(i,b+m,,),
num[a]++,num[b]++;
for(int i=; i<=n; i++)
team[i].lose+=num[i];
for(int i=; i<=n; i++)
ans+=power(team[i].win)*team[i].C+power(team[i].lose)*team[i].D;
for(int i=; i<=n; i++)
for(int j=;j<=num[i];j++)
insert(i+m,T,,*team[i].C*team[i].win+team[i].C+team[i].D-*team[i].D*team[i].lose),
team[i].lose--,team[i].win++;
}
int main()
{
n=read(),m=read();
for (int i=; i<=n; i++)
team[i].win=read(),team[i].lose=read(),
team[i].C=read(),team[i].D=read();
build();
int Maxflow=zkw();
printf("%d\n",ans);
return ;
}
吐槽一句..增广的过程中,一开始使用STL中的queue然后莫名的WA了?手写了个q...怒A...跑得飞快
【BZOJ-1449&2895】球队收益&球队预算 最小费用最大流的更多相关文章
- BZOJ1449[JSOI2009]球队收益&BZOJ2895球队预算——最小费用最大流
题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 提示 要求总费用最低 ...
- 【BZOJ】1221: [HNOI2001] 软件开发(最小费用最大流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1221 先吐槽一下,数组依旧开小了RE:在spfa中用了memset和<queue>的版本 ...
- BZOJ 1877:[SDOI2009]晨跑(最小费用最大流)
晨跑DescriptionElaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...
- 【BZOJ1449/2895】[JSOI2009]球队收益/球队预算 最小费用最大流
[BZOJ2895]球队预算 Description 在一个篮球联赛里,有n支球队,球队的支出是和他们的胜负场次有关系的,具体来说,第i支球队的赛季总支出是Ci*x^2+Di*y^2,Di<=C ...
- bzoj 4842 [Neerc2016]Delight for a Cat 最小费用最大流,线性规划
题意:有n个小时,对于第i个小时,睡觉的愉悦值为si,打隔膜的愉悦值为ei,同时对于任意一段连续的k小时,必须至少有t1时间在睡觉,t2时间在打隔膜.如果要获得的愉悦值尽 量大,求最大的愉悦值和睡觉还 ...
- BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/p ...
- 【BZOJ】1877: [SDOI2009]晨跑(最小费用最大流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1877 费用流做多了,此题就是一眼题. 拆点表示只能经过一次,容量为1,费用为0. 然后再连边即可,跑 ...
- bzoj 4819: [Sdoi2017]新生舞会【二分+最小费用最大流】
如果\( b[i]==0 \)那么就是裸的费用流/KM,当然KM快一些但是为什么不写KM呢因为我不会打板子了 考虑二分答案,那么问题变成了判定问题. \[ ans=\frac {a_1+a_2+... ...
- 洛谷 P4307 [JSOI2009]球队收益 / 球队预算(最小费用最大流)
题面 luogu 题解 最小费用最大流 先假设剩下\(m\)场比赛,双方全输. 考虑\(i\)赢一局的贡献 \(C_i*(a_i+1)^2+D_i*(b_i-1)^2-C_i*a_i^2-D_i*b_ ...
随机推荐
- 创建文本,innerHTML与createTextNode的使用
第一种:innerHTML p.innerHTML="124"; 除了这个还可以console.log(p.innerHTML) 弹出p里面的内容; 第二种:createTextN ...
- 关于RACK的一点简单介绍
0 前言 如有错误欢迎指出,如需转载,请注明原文链接. 1 Rack是什么 一句话介绍,Rack是一个Web接口,定义了一系列的标准,具体实现的工作是交给服务器(puma, thin等)做的. 如果你 ...
- C#创建Windows Service(Windows 服务)基础教程
Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...
- 怎么样快速学习AngularJS?
其实AngularJS的官方网站首页的几个例子已经很好的展示了AngularJS的一些特性,下面我就从几个例子一步一步的讲解AngularJS吸引人的东西并且实际项目中是怎么使用ng的. 首先还是从第 ...
- 存储过程中执行动态Sql语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- 管窥MVVMLight Command参数绑定和事件传递
前言 由于在实际项目中,业务功能的增加导致软件开发规模在逐渐变大,所以我准备找个Silverlight框架来组织当前项目中的文件,以期能够让后续的业务功能增添和维护更加容易一些.无意中,我在这篇文章中 ...
- matlab建立双坐标
(1)设定双Y坐标 x=0:0.1:2*pi; y1=sin(x); y2=cos(x); y3=1-sin(x); [AX]=plotyy(x,y1,x,y2); %双Y坐标的建立 hold on; ...
- [CareerCup] 13.1 Print Last K Lines 打印最后K行
13.1 Write a method to print the last K lines of an input file using C++. 这道题让我们用C++来打印一个输入文本的最后K行,最 ...
- 工作随笔——tar命令批量解压
由于linux的tar命令不支持批量解压,所以很多网友编写了好多支持批量解压的shell命令,收集了一下,供大家分享: 第一: for tar in *.tar.gz; do tar xvf $tar ...
- php文件上传之多文件上传
在胡说之前,首先声明,本文是建立在掌握php单文件上传的基础上,所以这里就不赘述文件上传服务器配置,表单设置该注意的地方了. 话不多少,直入主题,在请求页面方面有两种写法(只呈现表单部分,以上传三个文 ...