【题解】JSOI2009球队收益 / 球队预算
2024-08-27 06:17:39
为什么大家都不写把输的场次增加的呢?我一定要让大家知道,这并没有什么关系~所以 \(C[i] <= D[i]\) 的条件就是来卖萌哒??
#include <bits/stdc++.h>
using namespace std;
#define maxn 1000000
#define INF 99999999
int n, m, S, T, rec[maxn], flow[maxn], a[maxn], b[maxn];
int ans, tot, c[maxn], d[maxn], dis[maxn], num[maxn];
bool vis[maxn]; int read() {
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} struct edge {
int cnp, to[maxn], last[maxn], head[maxn], f[maxn], co[maxn];
edge() { cnp = ; }
void add(int u, int v, int fl, int w) {
to[cnp] = v, f[cnp] = fl, co[cnp] = w, last[cnp] = head[u], head[u] = cnp ++;
to[cnp] = u, f[cnp] = , co[cnp] = -w, last[cnp] = head[v], head[v] = cnp ++;
}
}E1; struct node {
int x, y;
}P[maxn]; int multi(int x) { return x * x; }
void Build() {
S = , T = * m + ;
for(int i = ; i <= n; i ++) {
int A = a[i] + num[i], B = b[i];
if(num[i]) rec[i] = tot + ;
for(int j = ; j <= num[i]; j ++) {
++ tot;
E1.add(tot, T, , * B * d[i] - * A * c[i] + c[i] + d[i]);
if(j != num[i]) E1.add(tot, tot + , INF, );
A --, B ++;
}
}
for(int i = ; i <= m; i ++) {
E1.add(S, ++ tot, , );
E1.add(tot, rec[P[i].x], , );
E1.add(tot, rec[P[i].y], , );
}
} bool SPFA() {
queue <int> q;
for(int i = ; i <= T; i ++) dis[i] = INF, vis[i] = ;
q.push(S); dis[S] = ; flow[S] = INF;
while(!q.empty()) {
int u = q.front(); q.pop(); vis[u] = ;
for(int i = E1.head[u]; i; i = E1.last[i]) {
int v = E1.to[i];
if(!E1.f[i]) continue;
if(dis[v] > dis[u] + E1.co[i]) {
dis[v] = dis[u] + E1.co[i];
rec[v] = i, flow[v] = min(flow[u], E1.f[i]);
if(!vis[v]) q.push(v), vis[v] = ;
}
}
}
if(dis[T] != INF) return ;
return ;
} int Max_Flow() {
int ans = , cost = ;
while(SPFA()) {
int u = T;
while(u != S) {
int t = rec[u];
E1.f[t] -= flow[T], E1.f[t ^ ] += flow[T];
u = E1.to[t ^ ];
}
ans += flow[T], cost += dis[T] * flow[T];
}
return cost;
} int main() {
n = read(), m = read();
for(int i = ; i <= n; i ++) {
a[i] = read(), b[i] = read(), c[i] = read(), d[i] = read();
}
for(int i = ; i <= m; i ++) {
int x = read(), y = read();
num[x] ++, num[y] ++; P[i].x = x, P[i].y = y;
}
for(int i = ; i <= n; i ++)
ans += c[i] * multi(a[i] + num[i]) + d[i] * multi(b[i]);
Build();
printf("%d\n", ans + Max_Flow());
return ;
}
最新文章
- C#往线程里传递参数
- centos7命令
- COM 学习(五)——编译、注册、调用
- System.Transaction (TransactionScope) 与 可提升 (Promotable) 交易
- C:预编译指令
- NodeJS服务器:一行代码 = 一个的HTTP服务器
- 深入探索 Java 热部署--转
- JProtector java应用加密工具
- .Net多线程编程—使用Visual Studio 2012进行调试
- 开源半成品的Web版工作流模板设计器(基于AngularJS 2和Redux), 还在继续填坑中
- 文本挖掘预处理之向量化与Hash Trick
- 03.redis与ssm整合(mybatis二级缓存)
- MySQL之SELECT用法
- [AH/HNOI2017]影魔
- 在 ASP.NET Core 中集成 Skywalking APM
- 使用 ASP.NET Core MVC 创建 Web API(四)
- mybatis模糊查询
- NAT与网桥
- html5-css列表和表格
- BCG在程序中的使用
热门文章
- Linux golang使用cgo调用C++标准库问题
- Spring Cloud(二):服务注册与发现 Eureka【Finchley 版】
- Hadoop源码编译环境搭建
- UVA 816 Abbott&#39;s Revenge 紫书
- 满帮集团CEO:未来将向“智慧型”公司转变,要成为一家生态公司
- AutoResetEvent 方法名称设计缺陷
- vs2013+python+ cocos2d-x-3.3rc0环境搭建
- Java每日编程day2
- 人and绩效and职业道德
- 【CSAPP笔记】9. 汇编语言——缓冲区溢出