题目大意:给定n支球队。第i支球队已经赢了wini场。输了losei场,接下来还有m场比赛。每一个球队终于的收益为Ci∗x2i+Di∗y2i,当中xi为终于的胜场,yi为终于的负场

求最小化收益

考虑一仅仅球队,其收益与在接下来的比赛中的胜场数关系为:

赢0场 Ci∗win2i+Di∗(di+losei)2

赢1场 Ci∗(wini+1)2+Di∗(di+losei−1)2

赢2场 Ci∗(wini+2)2+Di∗(di+losei−2)2



赢di场 Ci∗(wini+di)2+Di∗lose2i

差分后可得:

赢第1场 Ci∗(2∗wini+1)−Di∗[2∗(di+losei)−1]

赢第2场 Ci∗(2∗wini+3)−Di∗[2∗(di+losei)−3]



赢第di场 Ci∗[2∗wini+(2∗di−1)]−Di∗[2∗(di+losei)−(2∗di−1)]

easy发现差分后单调递增。故收益是关于胜场数的一个下凸函数,能够拆边做

于是我们将每支球队和每场比赛都变成一个点,建图跑费用流

源点向第i个点连di条边。流量为1。第j条边的费用为Ci∗[2∗wini+(2∗j−1)]−Di∗[2∗(di+losei)−(2∗j−1)]

每场比赛的两方向这场比赛连一条流量为1费用为0的边

每场比赛向汇点连一条流量为1费用为0的边

最小费用+∑ni=1[Ci∗win2i+Di∗(di+losei)2]就是答案

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 6060
#define S 0
#define T (M-1)
#define INF 0x3f3f3f3f
using namespace std;
int n,m,ans;
int win[M],lose[M],C[M],D[M],d[M];
namespace Min_Cost_Max_Flow{
struct abcd{
int to,flow,cost,next;
}table[1001001];
int head[M],tot=1;
void Add(int x,int y,int f,int c)
{
table[++tot].to=y;
table[tot].flow=f;
table[tot].cost=c;
table[tot].next=head[x];
head[x]=tot;
}
void Link(int x,int y,int f,int c)
{
Add(x,y,f,c);
Add(y,x,0,-c);
}
bool Edmonds_Karp()
{
static int q[65540],cost[M],flow[M],from[M];
static unsigned short r,h;
static bool v[M];
int i;
memset(cost,0x3f,sizeof cost);
cost[S]=0;flow[S]=INF;q[++r]=S;
while(r!=h)
{
int x=q[++h];v[x]=false;
for(i=head[x];i;i=table[i].next)
if(table[i].flow&&cost[table[i].to]>cost[x]+table[i].cost)
{
cost[table[i].to]=cost[x]+table[i].cost;
flow[table[i].to]=min(flow[x],table[i].flow);
from[table[i].to]=i;
if(!v[table[i].to])
v[table[i].to]=true,q[++r]=table[i].to;
}
}
if(cost[T]==0x3f3f3f3f) return false;
ans+=cost[T]*flow[T];
for(i=from[T];i;i=from[table[i^1].to])
table[i].flow-=flow[T],table[i^1].flow+=flow[T];
return true;
}
}
int main()
{
using namespace Min_Cost_Max_Flow;
int i,j,x,y;
cin>>n>>m;
for(i=1;i<=n;i++)
scanf("%d%d%d%d",&win[i],&lose[i],&C[i],&D[i]);
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
Link(x,n+i,1,0);
Link(y,n+i,1,0);
Link(n+i,T,1,0);
d[x]++;d[y]++;
}
for(i=1;i<=n;i++)
{
ans+=C[i]*win[i]*win[i]+D[i]*(d[i]+lose[i])*(d[i]+lose[i]);
for(j=1;j<=d[i];j++)
Link(S,i,1, C[i]*(2*win[i]+j*2-1)-D[i]*(2*(d[i]+lose[i])-j*2+1) );
}
while( Edmonds_Karp() );
cout<<ans<<endl;
return 0;
}

BZOJ 1449 JSOI2009 球队收益 费用流的更多相关文章

  1. BZOJ 1449: [JSOI2009]球队收益( 最小费用最大流)

    先考虑假如全部输了的收益. 再考虑每场比赛球队赢了所得收益的增加量,用这个来建图.. --------------------------------------------------------- ...

  2. bzoj 1449 [JSOI2009]球队收益(费用拆分,最小费用流)

    1449: [JSOI2009]球队收益 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 547  Solved: 302[Submit][Status][ ...

  3. BZOJ 1449: [JSOI2009]球队收益 最小费用最大流 网络流

    https://www.lydsy.com/JudgeOnline/problem.php?id=1449 给每条路加上一个权值,每条路的费用是这条路的流量*权值,求最大流的最小费用. 每次spfa记 ...

  4. [bzoj 1449] 球队收益(费用流)

    [bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...

  5. 【BZOJ 1449】 1449: [JSOI2009]球队收益 (最小费用流)

    1449: [JSOI2009]球队收益 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 841  Solved: 483 Description Inpu ...

  6. 1449: [JSOI2009]球队收益

    1449: [JSOI2009]球队收益 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 757  Solved: 437[Submit][Status][ ...

  7. bozj 1449/2895: 球队预算 -- 费用流

    2895: 球队预算 Time Limit: 10 Sec  Memory Limit: 256 MB Description 在一个篮球联赛里,有n支球队,球队的支出是和他们的胜负场次有关系的,具体 ...

  8. 【BZOJ1449】[JSOI2009]球队收益(网络流,费用流)

    [BZOJ1449][JSOI2009]球队收益(网络流,费用流) 题面 BZOJ 洛谷 题解 首先对于一支队伍而言,总共进行多少场比赛显然是已知的,假设是\(n_i\)场,那么它的贡献是:\(C_i ...

  9. BZOJ1449[JSOI2009]球队收益&BZOJ2895球队预算——最小费用最大流

    题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 提示   要求总费用最低 ...

随机推荐

  1. CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模

    很久以前做过此类问题..就因为太久了..这题想了很久想不出..卡在推出等比的求和公式,有除法运算,无法快速幂取模... 看到了 http://blog.csdn.net/yangshuolll/art ...

  2. 在Window和Linux下使用Zthread库

    ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序. ZThread库的主页:http://zthread. ...

  3. 自学PHP 环境搭建

    自学PHP之环境搭建 一..首先 安装 phpStudy2013.exe 程序集成包  安装完可能端口被占用 需要手动设置 然后打开http://localhost:8080/phpMyAdmin/ ...

  4. 轻松学会多线程(四)——synchronized同步keyword知多少

    每个对象都有一把独占锁. 独占锁仅仅限制线程对它的同步方法的訪问,对非同步方法,独占锁没有意义. synchronizedkeyword能够作为函数的修饰符,也能够作为函数内的语句,也就是平时说的同步 ...

  5. C#反射Assembly 具体说明

    1.对C#反射机制的理解 2.概念理解后,必须找到方法去完毕,给出管理的主要语法 3.终于给出有用的样例,反射出来dll中的方法 反射是一个程序集发现及执行的过程,通过反射能够得到*.exe或*.dl ...

  6. pwd的实现

    #include <string.h> #include <stdlib.h> #include <dirent.h> #include <sys/types ...

  7. LINUX编程学习笔记(十四) 创建进程与 父子进程内存空间

    1什么是进程:进程是一个执行中的程序 执行的程序: 代码->资源->CPU 进程有很多数据维护:进程状态/进程属性 所有进程属性采用的一个树形结构体维护 ps  -a//所有进程 ps - ...

  8. linux内核基础(系统调用,简明)

    内核基础(系统调用) 在说系统调用之前.先来说说内核是怎么和我们交互的.或者说是怎么和我们产生交集的. 首先,内核是用来控制硬件的仅仅有内核才干直接控制硬件,所以说内核非常重要,假设内核被控制那么电脑 ...

  9. dom4j的用法

    package xml; import java.io.FileWriter; import java.io.IOException; import java.util.Iterator; impor ...

  10. FZU2179(数位dp)

    传送门:Chriswho 题意:求区间[1,n]内能整除自己本身各位数字的数的个数. 分析:这题跟CF 55D Beautiful numbers一样的,一个数能被它的所有非零数位整除,则能被它们的最 ...