bzoj 1449 [JSOI2009]球队收益(费用拆分,最小费用流)
1449: [JSOI2009]球队收益
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 547 Solved: 302
[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
【思路】
费用拆分,最小费用最大流。
由S向每场比赛连边(1,0),由每场比赛向两支队伍连边(1,0)。
考虑在胜w场败l场的基础上再赢一场,则增加cost = ci*w^2+di*l^2-ci*(w+1)^2-di*(l+1)^2=2*ci*w+ci+di+2*di*l的收益。当w增加时cost是单调递增的,所以可以每次相应连一条(1,cost)的边然后w++,l--再次添边直到比赛全部胜利,初始时假设剩余比赛全输。
【代码】
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std; typedef long long LL ;
const int maxn = +;
const int INF = 1e9; struct Edge{ int u,v,cap,flow,cost;
};
struct zkw {
int n,m,s,t;
int vis[maxn],d[maxn];
vector<int> G[maxn];
vector<Edge> es; void init(int n) {
this->n=n;
es.clear();
for(int i=;i<n;i++) G[i].clear();
}
void AddEdge(int u,int v,int cap,int cost) {
es.push_back((Edge){u,v,cap,,cost});
es.push_back((Edge){v,u,,,-cost});
m=es.size();
G[u].push_back(m-);
G[v].push_back(m-);
}
bool spfa() {
memset(vis,,sizeof(vis));
for(int i=;i<n;i++) d[i]=INF;
queue<int> q;
d[t]= , vis[t]= , q.push(t);
while(!q.empty()) {
int u=q.front(); q.pop() , vis[u]=;
for(int i=;i<G[u].size();i++) {
Edge& e=es[G[u][i]];
int v=e.v;
if(es[G[u][i]^].cap && d[v]>d[u]-e.cost) {
d[v]=d[u]-e.cost;
if(!vis[v]) {
vis[v]=;
q.push(v);
}
}
}
}
return d[s]!=INF;
}
int dfs(int u,int a,LL& cost) {
vis[u]=; if(u==t) return a;
int used=,w;
for(int i=;i<G[u].size();i++) {
Edge& e=es[G[u][i]];
int v=e.v;
if(d[u]-e.cost==d[v] && !vis[v] && e.cap) {
w=dfs(v,min(a-used,e.cap),cost);
cost+=w*e.cost;
e.cap-=w , es[G[u][i]^].cap+=w;
used+=w; if(used==a) return a;
}
}
return used;
}
int Mincost(int s,int t,LL& cost) {
this->s=s , this->t=t;
int flow=; cost=;
while(spfa()) {
vis[t]=;
while(vis[t]) {
memset(vis,,sizeof(vis));
flow+=dfs(s,INF,cost);
}
}
return flow;
}
} mc; int n,m;
int c[maxn],d[maxn],win[maxn],lose[maxn],in[maxn]; int main() {
scanf("%d%d",&n,&m);
mc.init(n+m+);
int s=n+m,t=s+;
FOR(i,,n)
scanf("%d%d%d%d",&win[i],&lose[i],&c[i],&d[i]);
int u,v;
FOR(i,,m) {
scanf("%d%d",&u,&v);
u--,v--;
in[u]++,in[v]++;
mc.AddEdge(s,i,,);
mc.AddEdge(i,m+u,,);
mc.AddEdge(i,m+v,,);
}
LL ans=;
FOR(i,,n) {
lose[i]+=in[i];
ans+=c[i]*win[i]*win[i]+d[i]*lose[i]*lose[i];
}
FOR(i,,n) {
FOR(j,,in[i]) {
mc.AddEdge(m+i,t,,*c[i]*win[i]+c[i]+d[i]-*d[i]*lose[i]);
lose[i]-- , win[i]++;
}
}
LL cost;
mc.Mincost(s,t,cost);
printf("%lld",cost+ans);
return ;
}
bzoj 1449 [JSOI2009]球队收益(费用拆分,最小费用流)的更多相关文章
- BZOJ 1449 JSOI2009 球队收益 费用流
题目大意:给定nn支球队.第ii支球队已经赢了winiwin_i场.输了loseilose_i场,接下来还有mm场比赛.每一个球队终于的收益为Ci∗x2i+Di∗y2iC_i*x_i^2+D_i*y_ ...
- BZOJ 1449: [JSOI2009]球队收益( 最小费用最大流)
先考虑假如全部输了的收益. 再考虑每场比赛球队赢了所得收益的增加量,用这个来建图.. --------------------------------------------------------- ...
- BZOJ 1449: [JSOI2009]球队收益 最小费用最大流 网络流
https://www.lydsy.com/JudgeOnline/problem.php?id=1449 给每条路加上一个权值,每条路的费用是这条路的流量*权值,求最大流的最小费用. 每次spfa记 ...
- 【BZOJ 1449】 1449: [JSOI2009]球队收益 (最小费用流)
1449: [JSOI2009]球队收益 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 841 Solved: 483 Description Inpu ...
- 1449: [JSOI2009]球队收益
1449: [JSOI2009]球队收益 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 757 Solved: 437[Submit][Status][ ...
- [bzoj 1449] 球队收益(费用流)
[bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...
- 【BZOJ1449】[JSOI2009]球队收益(网络流,费用流)
[BZOJ1449][JSOI2009]球队收益(网络流,费用流) 题面 BZOJ 洛谷 题解 首先对于一支队伍而言,总共进行多少场比赛显然是已知的,假设是\(n_i\)场,那么它的贡献是:\(C_i ...
- BZOJ1449[JSOI2009]球队收益&BZOJ2895球队预算——最小费用最大流
题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 提示 要求总费用最低 ...
- 【bzoj1449/bzoj2895】[JSOI2009]球队收益/球队预算 费用流
题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 题解 费用流 由于存在一 ...
随机推荐
- Android-自定义多TAB悬浮控件实现蘑菇街首页效果
因为项目的一些需求需要用到此种展现方式. 找了市面上大部分有类似功能的应用. 基本思路嵌套ScrollView 转换事件分发给listview 实现. 但是此种方案有个缺点. 在ScrollVie ...
- VsSharp:一个VS扩展开发框架(上)
上篇:设计 一.引子 自2008年起开发SSMS插件SqlSharp(er)的过程中,有一天发现多数代码都大同小异,就像这样. Commands2 commands = (Commands2)_app ...
- oracle官方文档- length篇
一.首先介绍下单字节字符集和 多字节字符集 2.2字符编码方案 2.2.1 单字节编码 (1)单字节7位字符集,可以定义128个字符,最常用的字符集为 US7ASCII (2)单字节8 ...
- javascript基础学习(一)
javascript输出: javascript通过不同的方式来显示数据: (1)windows.alert()弹出警告框: (2)document.write()将方法写入HTML文档中: (3)i ...
- undefined与null的区别(待修整)
没有实体的对象称为空对象.只用对象的引用,而不存在引用的实体对象 就叫做空对象 在常见的强类型语言中,通常有一个表示"空"的值,比如NULL.但是在Javascript中,空(或者 ...
- Sqoop import加载HBase过程中,遇到Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x
在执行hbase sqoop抽取的时候,遇到了一个错误,如下图: 在执行程序的过程中,遇到权限问题很正常,也容易让人防不胜防,有问题就想办法解决,这个是关键. 解决办法如下: 第一步:su hdfs, ...
- spring配置中引入properties
<context:property-placeholder location="classpath*:db.properties" />
- iPhone、iPad默认按钮样式问题
iPhone.iPad默认按钮样式问题 解决方法给按钮元素添加一个-webkit-appearance: none;具体代码 input[type="button"], input ...
- 全部与精简切换显示jQuery实例教程
下面是某网站上的一个品牌列表展示效果,用户进入页面时,品牌列表默认是精简显示的(即不完整的品牌列表)效果如下图所示: 用户可以单击商品列表下方的“显示全部品牌”按钮来显示全部的品牌.单击“显示全部品牌 ...
- linux常用指令(飞天云)
1.svn相关指令 svn co svn://... //check out 到本地 2.pangu相关 pu cpdir pangu://... //复制pangu里面对应的文件夹到本 ...