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

--------------------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
 
#define rep( i , n ) for( int i = 0 ; i < n ; ++i )
#define clr( x , c ) memset( x , c , sizeof( x ) )
#define Rep( i , n ) for( int i = 1 ; i <= n ; ++i )
 
using namespace std;
 
const int maxn = 6000 + 5;
const int INF = 0x3f3f3f3f;
 
struct edge {
int to , cap , cost;
edge *next , *rev;
};
 
edge* pt;
edge* head[ maxn ];
edge EDGE[ 20000 ];
 
void init() { 
pt = EDGE;
clr( head , 0 );
}
 
inline void add( int u , int v , int d , int w ) {
pt -> to = v;
pt -> cap = d;
pt -> cost = w;
pt ->next = head[ u ];
head[ u ] = pt++;
}
 
inline void add_edge( int u , int v , int d , int w ) {
add( u , v , d , w );
add( v , u , 0 , -w );
head[ u ] -> rev = head[ v ];
head[ v ] -> rev = head[ u ];
}
 
edge* p[ maxn ];
int d[ maxn ] , a[ maxn ] , inQ[ maxn ];
 
int min_cost( int S , int T ) {
int cost = 0;
for( ; ; ) {
clr( d , INF );
d[ S ] = 0;
clr( inQ , 0 );
queue< int > Q;
a[ S ] = INF , Q.push( S );
while( ! Q.empty() ) {
int x = Q.front();
Q.pop();
inQ[ x ] = false;
   for( edge* e = head[ x ] ; e ; e =  e -> next )
       if( e -> cap > 0 && d[ e -> to ] > d[ x ] + e -> cost ) {
       
        int to = e -> to;
       
        d[ to ] = d[ x ] + e -> cost;
        a[ to ] = min( a[ x ] , e -> cap );
        p[ to ] = e;
       
        if( ! inQ[ to ] ) 
           Q.push( to ) , inQ[ to ] = true;
           
       }
       
}
if( d [ T ] == INF ) break;
cost += d[ T ] * a[ T ];
int x = T;
while( x != S ) {
p[ x ] -> cap -= a[ T ];
p[ x ] -> rev -> cap += a[ T ];
x = p[ x ] -> rev -> to;
}
}
return cost; 
}
 
int win[ maxn ] , lose[ maxn ];
int C[ maxn ] , D[ maxn ];
int cnt[ maxn ];
 
int main() {
init();
int n , m;
cin >> n >> m;
int s = 0 , t = n + m + 1;
Rep( i , n ) {
   scanf( "%d%d%d%d" , &win[ i ] , &lose[ i ] , &C[ i ] , &D[ i ] );
   cnt[ i ] = 0;
}
Rep( i , m ) {
int u , v;
scanf( "%d%d" , &u , &v );
cnt[ u ]++ , cnt[ v ]++;
add_edge( s , i , 1 , 0 );
add_edge( i , u + m , 1 , 0 );
add_edge( i , v + m , 1 , 0 );
}
int ans = 0;
Rep( i , n ) {
int x = i + m;
lose[ i ] += cnt[ i ];
ans += C[ i ] * win[ i ] * win[ i ] + D[ i ] * lose[ i ] * lose[ i ];
while( cnt[ i ]-- ) {
add_edge( x , t , 1 , 2 * ( C[ i ] * win[ i ] - D[ i ] * lose[ i ] ) + C[ i ] + D[ i ] );
win[ i ]++;
lose[ i ]--;
}
}
cout << min_cost( s , t ) + ans << "\n";
return 0;
}

--------------------------------------------------------------------------------------------------

1449: [JSOI2009]球队收益

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 500  Solved: 272
[Submit][Status][Discuss]

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

BZOJ 1449: [JSOI2009]球队收益( 最小费用最大流)的更多相关文章

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

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

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

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

  3. BZOJ 1449 JSOI2009 球队收益 费用流

    题目大意:给定nn支球队.第ii支球队已经赢了winiwin_i场.输了loseilose_i场,接下来还有mm场比赛.每一个球队终于的收益为Ci∗x2i+Di∗y2iC_i*x_i^2+D_i*y_ ...

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

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

  5. 【BZOJ-1449&2895】球队收益&球队预算 最小费用最大流

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

  6. 1449: [JSOI2009]球队收益

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

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

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

  8. BZOJ 2668 [cqoi2012]交换棋子 | 最小费用最大流

    传送门 BZOJ 2668 题解 同时分别限制流入和流出次数,所以把一个点拆成三个:入点in(x).中间点mi(x).出点ou(x). 如果一个格子x在初始状态是黑点,则连(S, mi(x), 1, ...

  9. BZOJ 1061 志愿者招募(最小费用最大流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1061 题意:申奥成功后,布布经过不懈努力,终于 成为奥组委下属公司人力资源部门的主管.布 ...

随机推荐

  1. 强制杀oracle进程

    强制杀oracle进程: for p in `ps -ef| grep ora| awk '{print $2}'`;do kill -9 $p;done 修改 oracle xe 默认中文字符集成为 ...

  2. C++_bool

    1 0 #include <iostream> using namespace std; void main() { && || || - && ; std ...

  3. TASKKILL命令使用方法

    TASKKILL [/S system [/U username [/P [password]]]]          { [/FI filter] [/PID processid | /IM ima ...

  4. ASPxGridView-为每行添加序号

    添加一个新的非绑定列,使用CustomColumnDisplayText事件来分配序号给该列 <dx:GridViewDataTextColumn Caption="序号" ...

  5. Spring MVC详细示例实战教程【转】

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  6. Android - 不管在应用的哪个activity按Home键整个App就结束了

    最开始,客户反映说在用app的时候,来个电话,接完再点app,不是原来的界面,而是重启了.数据都没了,所以就在activity重写onSaveInstanceState方法,将数据保存起来.后经测试发 ...

  7. Matlab中边缘提取方法简析

    1.Matlab简述 Matlab是国际上最流行的科学与工程计算的软件工具,它起源于矩阵运算,已经发展成一种高度集成的计算机语言.有人称它为“第四代”计算机语言,它提供了强大的科学运算.灵活的程序设计 ...

  8. UITextField键盘类型

    UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)];  //初始化textfield并 ...

  9. spring拦截器的定义

    (一).拦截器的定义 1.为什么需要拦截器:在做身份认证或者是进行日志的记录时,我们需要通过拦截器达到我们的目的 2.什么事拦截器:在AOP(Aspect-Oriented Programming)中 ...

  10. Java中的流程控制(一)

    程序的流程控制(一) 关于Java程序的流程控制(一) 从结构化程序设计角度出发,程序有三种结构: 顺序结构 选择结构 循环结构 1.顺序结构 就是程序从上到下一行行执行,中间没有判断和跳转. 2.i ...