BZOJ 1449 球队收益(最小费用最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1449
题意:
思路:首先,我们假设后面的M场比赛两方都是输的,即初始时的lose[i]再加上i参加的场次。这样,后面对于i,每赢一场的收益增加值为:
之后win[i]++,lose[i]--。至此,我们得到建图的方法:
(1)源点到每场比赛连流量1,费用0;
(2)每场比赛向双方连流量1,费用0;
(3)每个人到汇点连x条边(x为该人在M场比赛中出现的次数),流量1,费用为上面计算出的add值。每条边的add值是不同的。
最后计算最小费用再加上初始时的收益就是答案。
struct node
{
int u,v,next,cost,cap;
};
node edges[N*50];
int head[N],e;
void add(int u,int v,int cap,int cost)
{
edges[e].u=u;
edges[e].v=v;
edges[e].cap=cap;
edges[e].cost=cost;
edges[e].next=head[u];
head[u]=e++;
}
void Add(int u,int v,int cap,int cost)
{
add(u,v,cap,cost);
add(v,u,0,-cost);
}
int pre[N],F[N],C[N],visit[N];
int SPFA(int s,int t,int n)
{
int i;
for(i=0;i<=n;i++) F[i]=0,C[i]=INF,visit[i]=0;
queue<int> Q;
Q.push(s); F[s]=INF; C[s]=0;
int u,v,cost,cap;
while(!Q.empty())
{
u=Q.front();
Q.pop();
visit[u]=0;
for(i=head[u];i!=-1;i=edges[i].next)
{
if(edges[i].cap>0)
{
v=edges[i].v;
cost=edges[i].cost;
cap=edges[i].cap;
if(C[v]>C[u]+cost)
{
C[v]=C[u]+cost;
F[v]=min(F[u],cap);
pre[v]=i;
if(!visit[v]) visit[v]=1,Q.push(v);
}
}
}
}
return F[t];
}
i64 MCMF(int s,int t,int n)
{
int i,x,temp;
i64 ans=0;
while(temp=SPFA(s,t,n))
{
for(i=t;i!=s;i=edges[pre[i]].u)
{
x=pre[i];
ans+=edges[x].cost*temp;
edges[x].cap-=temp;
edges[x^1].cap+=temp;
}
}
return ans;
}
int n,m,win[N],lose[N],c[N],d[N];
int det[N],S,T;
int cal(int i)
{
int temp=2*win[i]*c[i]-2*(lose[i]+det[i])*d[i]+c[i]+d[i];
win[i]++;
det[i]--;
return temp;
}
int main()
{
RD(n,m);
int i;
i64 ans=0;
FOR1(i,n)
{
RD(win[i],lose[i]),RD(c[i],d[i]);
}
int x[N],y[N];
FOR1(i,m)
{
RD(x[i],y[i]);
det[x[i]]++; det[y[i]]++;
}
FOR1(i,n) ans+=c[i]*sqr(win[i])+d[i]*sqr(lose[i]+det[i]);
S=0; T=n+m+1;
clr(head,-1);
FOR1(i,m) Add(S,i,1,0),Add(i,m+x[i],1,0),Add(i,m+y[i],1,0);
int j,k;
FOR1(i,n)
{
k=det[i];
FOR1(j,k) Add(m+i,T,1,cal(i));
}
ans+=MCMF(S,T,T+1);
PR(ans);
}
BZOJ 1449 球队收益(最小费用最大流)的更多相关文章
- BZOJ 1449: [JSOI2009]球队收益 最小费用最大流 网络流
https://www.lydsy.com/JudgeOnline/problem.php?id=1449 给每条路加上一个权值,每条路的费用是这条路的流量*权值,求最大流的最小费用. 每次spfa记 ...
- BZOJ 1449: [JSOI2009]球队收益( 最小费用最大流)
先考虑假如全部输了的收益. 再考虑每场比赛球队赢了所得收益的增加量,用这个来建图.. --------------------------------------------------------- ...
- [bzoj 1449] 球队收益(费用流)
[bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...
- 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 1927 星际竞速(最小费用最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1927 题意:一个图,n个点.对于给出的每条边 u,v,w,表示u和v中编号小的那个到编号 ...
- BZOJ 2424: [HAOI2010]订货(最小费用最大流)
最小费用最大流..乱搞即可 ------------------------------------------------------------------------------ #includ ...
- 【BZOJ-1449&2895】球队收益&球队预算 最小费用最大流
1449: [JSOI2009]球队收益 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 648 Solved: 364[Submit][Status][ ...
- 【BZOJ1449/2895】[JSOI2009]球队收益/球队预算 最小费用最大流
[BZOJ2895]球队预算 Description 在一个篮球联赛里,有n支球队,球队的支出是和他们的胜负场次有关系的,具体来说,第i支球队的赛季总支出是Ci*x^2+Di*y^2,Di<=C ...
- BZOJ 1070: [SCOI2007]修车 [最小费用最大流]
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 4936 Solved: 2032[Submit][Status] ...
随机推荐
- 【海岛帝国系列赛】No.1 海岛帝国:诞辰之日
50111117海岛帝国:诞辰之日 [试题描述] YSF自从上次“被盗投降”完(带着一大堆债)回去以后,YSF对“海盗”怀念至今,他想要建立一个“药师傅”海岛帝国. 今天,他要像“管理部”那样去探寻 ...
- COM编程之三 QueryInterface
[1]IUnknown接口 客户同组件交互都是通过接口完成的. 在客户查询组件的其它接口时,也是通过接口完成的.而那个接口就是IUnknown. IUnknown接口的定义包含在Win32SDK中的U ...
- android 学习随笔六(网络要求及配置)
android在4.0之后已经不允许在主线程执行http请求了. 主线程阻塞,应用会停止刷新界面,停止响应用户任何操作,耗时操作不要写在主线程 只有主线程才能修改UI ANR异常:Applicat ...
- python核心编程学习记录之基础知识
虽然对python的基础知识有所了解,但是为了更深入的学习,要对python的各种经典书籍进行学习 第一章介绍python的优缺点,略过 第二章介绍python起步,第三章介绍python基础,仅记录 ...
- FireDac 与数据库连接时字符集及对应的字段类型问题
近日在一个过程调用时发生一个奇怪现象, 异常返回意思是说, 数据的长度是[6], 而字段定义的长度是[3]. 分析后认为: 调用过程你不涉及到对返回数据集的字段手动定义问题, 出现这个问题应是两边 ...
- DButil
纲要: Properties prop = new Properties(); BasicDataSource ds = new BasicDataSorce(); Connection conn = ...
- SoupUI的使用
- TI CC2541的GPIO引脚设置.
P1SEL寄存器, 0xF4, 功能选择用的, 0表示GPIO口, 1表示外设.
- 如何修复损坏的MySQL数据表
id=164 由于断电或非正常关机而导致MySQL数据库出现错误是非常常见的问题.有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用M ...
- peak num
class Solution {public: int findPeakElement(vector<int>& nums) { int i=0; int n=nums ...