Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 741  Solved: 423

Description

Input

Output

一个整数表示联盟里所有球队收益之和的最小值。

Sample Input

3 3
1 0 2 1
1 1 10 1
0 1 3 3
1 2
2 3
3 1

Sample Output

43

HINT

Source

最小费用最大流。

  比赛无论胜负都会给球队带来收益,使得建边极为困难。考虑转化问题,首先假设每场比赛的结果是“两方都输”,以此为初始状态,之后决策某个队伍胜利,则获得的收益为“赢的收益-输的收益”。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
const int INF=1e8;
const int mxn=;
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;
}
struct edge{
int from,v,nxt;
int f,w;
}e[mxn<<];
int hd[mxn],mct=;//
void add_edge(int u,int v,int c,int w){
e[++mct].v=v;e[mct].from=u;e[mct].nxt=hd[u];e[mct].f=c;e[mct].w=w;hd[u]=mct;return;
}
//
int n,m;
int S,T;
int ans=;
int win[mxn],lose[mxn],c[mxn],d[mxn];
//
int dis[mxn];
bool inq[mxn];
int pre[mxn<<];
void SPFA(int s){
memset(dis,0x3f,sizeof dis);
memset(pre,-,sizeof pre);
queue<int>q;
dis[s]=;
inq[s]=;
q.push(s);
while(!q.empty()){
int u=q.front();q.pop();inq[u]=;
for(int i=hd[u];i;i=e[i].nxt){
if(!e[i].f)continue;
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
pre[v]=i;//记录前驱边
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
}
return;
}
void maxflow(int s,int t){
SPFA(s);
while(pre[t]!=-){
int tmp=INF;
for(int i=pre[t];i!=-;i=pre[e[i].from])
tmp=min(tmp,e[i].f);
ans+=dis[t]*tmp;
for(int i=pre[t];i!=-;i=pre[e[i].from]){
e[i].f-=tmp;
e[i^].f+=tmp;
}
SPFA(s);
}
return;
}
int a[mxn],b[mxn];
int main()
{
int i,j,u,v;
n=read();m=read();
for(i=;i<=n;i++){
win[i]=read();lose[i]=read();
c[i]=read();d[i]=read();
}
for(i=;i<=m;i++){
a[i]=read();b[i]=read();
++lose[a[i]];++lose[b[i]];
}
for(i=;i<=n;i++){//假设全部都输掉
ans+=c[i]*win[i]*win[i];
ans+=d[i]*lose[i]*lose[i];
}
S=;T=m+n+;
for(i=;i<=m;i++){
add_edge(S,i,,);
add_edge(i,S,,);
add_edge(i,m+a[i],,);
add_edge(m+a[i],i,,);
add_edge(i,m+b[i],,);
add_edge(m+b[i],i,,);
//a
int cost=c[a[i]]*(*win[a[i]]+)-d[a[i]]*(*lose[a[i]]-);
add_edge(m+a[i],T,,cost);
add_edge(T,m+a[i],,-cost);
win[a[i]]++;lose[a[i]]--;
//b
cost=c[b[i]]*(*win[b[i]]+)-d[b[i]]*(*lose[b[i]]-);
add_edge(m+b[i],T,,cost);
add_edge(T,m+b[i],,-cost);
win[b[i]]++;lose[b[i]]--;
}
maxflow(S,T);
printf("%d\n",ans);
return ;
}

Bzoj1449 [JSOI2009]球队收益的更多相关文章

  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 提示   要求总费用最低 ...

  2. [BZOJ1449] [JSOI2009]球队收益 / [BZOJ2895] 球队预算

    Description 在一个篮球联赛里,有n支球队,球队的支出是和他们的胜负场次有关系的,具体来说,第i支球队的赛季总支出是Cix^2+Diy^2,Di<=Ci.(赢得多,给球员的奖金就多嘛) ...

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

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

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

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

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

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

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

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

  7. 1449: [JSOI2009]球队收益

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

  8. 【bzoj1449/bzoj2895】[JSOI2009]球队收益/球队预算 费用流

    题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 题解 费用流 由于存在一 ...

  9. 【BZOJ1449】 球队收益

    BZOJ1449 球队收益 Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 Sa ...

随机推荐

  1. Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  2. [MetaHook] SearchPattern function

    By Nagi void *SearchPattern(void *pStartSearch, DWORD dwSearchLen, char *pPattern, DWORD dwPatternLe ...

  3. Jenkins进阶系列之——17Jenkins升级、迁移和备份

    升级Jenkins Jenkins的开发迭代非常快,每周发布一个开发版本,长期支持版每半年更新一次(ps:大版本更新).如此频繁的更新,怎么升级呢? war:下载新版的war文件,替换旧版本war文件 ...

  4. ubuntu 安装VmTool

    VM tools 是Vmware的一组工具.主要用于虚拟主机显示优化与调整,另外还可以方便虚拟主机与本机的交互,如允许共享文件夹,甚至可以直接从本机向虚拟主机拖放文件.鼠标无缝切换.显示分辨率调整等, ...

  5. opencv5-objdetect之级联分类器

    这是<opencv2.4.9tutorial.pdf>的objdetect module的唯一一个例子. 在opencv中进行人脸或者人眼 或者身体的检测 首先就是训练好级联分类器,然后就 ...

  6. DataTrigger 绑定枚举

    在触发器中绑定枚举类型: <ControlTemplate.Triggers> <DataTrigger Binding="{Binding CheckStateEnum} ...

  7. java并发:同步容器&并发容器

    第一节 同步容器.并发容器 1.简述同步容器与并发容器 在Java并发编程中,经常听到同步容器.并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同 ...

  8. Android视频播放之VideoView

    Android视频播放之VideoView 1.VideoView类介绍 Android的VideoView组件可以从不同的来源(例如资源文件或内容提供器)读取图像,计算和维护视频的画面尺寸以使其适用 ...

  9. Bootstrap系列 -- 5. 文本对齐方式

    一. 文本对齐样式 .text-left:左对齐 .text-center:居中对齐 .text-right:右对齐 .text-justify:两端对齐 二. 使用方式 <p class=&q ...

  10. [BZOJ2654]tree(二分+MST)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...