为什么大家都不写把输的场次增加的呢?我一定要让大家知道,这并没有什么关系~所以 \(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 ;
}

最新文章

  1. C#往线程里传递参数
  2. centos7命令
  3. COM 学习(五)——编译、注册、调用
  4. System.Transaction (TransactionScope) 与 可提升 (Promotable) 交易
  5. C:预编译指令
  6. NodeJS服务器:一行代码 = 一个的HTTP服务器
  7. 深入探索 Java 热部署--转
  8. JProtector java应用加密工具
  9. .Net多线程编程—使用Visual Studio 2012进行调试
  10. 开源半成品的Web版工作流模板设计器(基于AngularJS 2和Redux), 还在继续填坑中
  11. 文本挖掘预处理之向量化与Hash Trick
  12. 03.redis与ssm整合(mybatis二级缓存)
  13. MySQL之SELECT用法
  14. [AH/HNOI2017]影魔
  15. 在 ASP.NET Core 中集成 Skywalking APM
  16. 使用 ASP.NET Core MVC 创建 Web API(四)
  17. mybatis模糊查询
  18. NAT与网桥
  19. html5-css列表和表格
  20. BCG在程序中的使用

热门文章

  1. Linux golang使用cgo调用C++标准库问题
  2. Spring Cloud(二):服务注册与发现 Eureka【Finchley 版】
  3. Hadoop源码编译环境搭建
  4. UVA 816 Abbott&#39;s Revenge 紫书
  5. 满帮集团CEO:未来将向“智慧型”公司转变,要成为一家生态公司
  6. AutoResetEvent 方法名称设计缺陷
  7. vs2013+python+ cocos2d-x-3.3rc0环境搭建
  8. Java每日编程day2
  9. 人and绩效and职业道德
  10. 【CSAPP笔记】9. 汇编语言——缓冲区溢出