[TJOI2015]线性代数 网络流
题面
题解
先化一波式子:
\]
\]
\]
\]
\]
\]
\]
因此选\(i\)和\(j\)则得到\(B_{ij}\)的贡献,选\(i\)则花费\(C_i\)的代价。
因此我们有如下关系:选\((i, j)\)则必选\(i, j\).
因此建图方式如下:
- 对于每个二元组\((i, j)\),我们连\(s --- > (i, j) : B_{ij}\)
- 对于每个二元组\((i, j)\),我们连\((i, j) ---> i : inf , (i, j) ---> j : inf\)
- 对于每个点\(i\),我们连\(i ---> t : C_i\)
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 550
#define ac 1000000
#define maxn 3000000
#define inf 1000000000
//#define D printf("in line %d\n", __LINE__);
int n, s, t, x, addflow, ans, all;
int B[AC][AC], C[AC];
int Head[ac], date[maxn], Next[maxn], haveflow[maxn], tot = 1;
int have[ac], good[ac], c[ac], last[ac];
int q[ac], head, tail;
inline int read()
{
int x = 0;char c = getchar();
while(c > '9' || c < '0') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x;
}
inline void upmin(int &a, int b) {if(b < a) a = b;}
inline void upmax(int &a, int b) {if(b > a) a = b;}
inline void add(int f, int w, int S)
{
date[++ tot] = w, Next[tot] = Head[f], Head[f] = tot, haveflow[tot] = S;
date[++ tot] = f, Next[tot] = Head[w], Head[w] = tot, haveflow[tot] = 0;
//printf("%d --- > %d : %d\n", f, w, S);
}
void bfs()
{
q[++ tail] = t, have[1] = c[t] = 1;
while(head < tail)
{
int x = q[++ head];
for(R i = Head[x]; i; i = Next[i])
{
int now = date[i];
if(!c[now] && haveflow[i ^ 1])
{
++ have[c[now] = c[x] + 1];
q[++ tail] = now;
}
}
}
memcpy(good, Head, sizeof(good));
}
void aru()
{
while(x != s)
{
haveflow[last[x]] -= addflow;
haveflow[last[x] ^ 1] += addflow;
x = date[last[x] ^ 1];
}
ans -= addflow, addflow = inf;
}
void ISAP()
{
bool done = false;
addflow = inf, x = s;
while(c[t] != all + 10)
{
if(x == t) aru();
done = false;
for(R i = good[x]; i; i = Next[i])
{
int now = date[i];
good[x] = i;
if(c[now] == c[x] - 1 && haveflow[i])
{
upmin(addflow, haveflow[i]);
last[now] = i, x = now, done = true;
break;
}
}
if(!done)
{
int go = all + 9;
for(R i = Head[x]; i; i = Next[i])
if(c[date[i]] && haveflow[i]) upmin(go, c[date[i]]);
good[x] = Head[x];
if(!(-- have[c[x]])) break;
have[c[x] = go + 1] ++;
if(x != s) x = date[last[x] ^ 1];
}
}
printf("%d\n", ans);
}
void pre()
{
n = read(), all = n * n + n, s = all + 1, t = s + 1;
for(R i = 1; i <= n; i ++)
for(R j = 1; j <= n; j ++) B[i][j] = read(), ans += B[i][j];
for(R i = 1; i <= n; i ++) C[i] = read();
}
inline int id(int i, int j){return (i - 1) * n + j;}
void build()
{
for(R i = 1; i <= n; i ++)
for(R j = 1; j <= n; j ++)
{
int ID = id(i, j);
add(s, ID, B[i][j]);
add(ID, n * n + i, inf), add(ID, n * n + j, inf);
}
for(R i = 1; i <= n; i ++) add(n * n + i, t, C[i]);
}
int main()
{
// freopen("in.in", "r", stdin);
pre();
build();
bfs();
ISAP();
// fclose(stdin);
return 0;
}
[TJOI2015]线性代数 网络流的更多相关文章
- [TJOI2015]线性代数(网络流)
[TJOI2015]线性代数(最大权闭合子图,网络流) 为了提高智商,ZJY开始学习线性代数.她的小伙伴菠萝给她出了这样一个问题:给定一个n*n的矩阵B和一个1×n的矩阵C.求出一个1×n的01矩阵A ...
- 【BZOJ 3996】 3996: [TJOI2015]线性代数 (最小割)
3996: [TJOI2015]线性代数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1368 Solved: 832 Description 给 ...
- bzoj 3996: [TJOI2015]线性代数 [最小割]
3996: [TJOI2015]线性代数 题意:给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 \(D=(A * B-C)* A^T\)最大.其中A^T为A的转置.输出D.每 ...
- BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图
BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大. ...
- 【BZOJ3996】[TJOI2015]线性代数(最小割)
[BZOJ3996][TJOI2015]线性代数(最小割) 题面 BZOJ 洛谷 题解 首先把式子拆开,发现我们的答案式就是这个: \[\sum_{i=1}^n\sum_{j=1}^n B_{i,j} ...
- 【LG3973】[TJOI2015]线性代数
[LG3973][TJOI2015]线性代数 题面 洛谷 题解 正常解法 一大堆矩阵乘在一起很丑对吧 化一下柿子: \[ D=(A*B-C)*A^T\\ \Leftrightarrow D=\sum_ ...
- [Luogu 3973] TJOI2015 线性代数
[Luogu 3973] TJOI2015 线性代数 这竟然是一道最小割模型. 据说是最大权闭合子图. 先把矩阵式子推出来. 然后,套路建模就好. #include <algorithm> ...
- 【BZOJ3996】[TJOI2015]线性代数 最大权闭合图
[BZOJ3996][TJOI2015]线性代数 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的 ...
- 【BZOJ】3996: [TJOI2015]线性代数
题意 给出一个\(N \times N\)的矩阵\(B\)和一个\(1 \times N\)的矩阵\(C\).求出一个\(1 \times N\)的01矩阵\(A\),使得\[ D = ( A * B ...
随机推荐
- Kettle定时执行
1,Kettle跨平台使用. 例如:在AIX下(AIX是IBM商用UNIX操作系统,此处在LINUX/UNIX同样适用),运行Kettle的相关步骤如下: 1)进入到Kettle部署的路径 ...
- Mysql 开启Federated引擎的方法
原文参考:http://www.thinksaas.cn/topics/0/63/63532.html 进入mysql命令行,没有看到Federated,说明没有安装 mysql>show en ...
- 搜索引擎Solr6.2.1 索引富文本(word/pdf/txt/html)
一:首先建立Core 在core下面新建lib文件夹,存放相关的jar包,如图所示: lib文件夹打开所示,这些类库在solr6.2.1解压之后都能找到: 修改solrconfig.xml,把刚刚建的 ...
- ln in Linux
默认情况(硬连接) ln 目标 连接名称 ll -i 显示文件的inode信息,即文件节点信息 ➜ test1 ll -i 1.txt 27987655 -rw-r--r-- 1 myuser ...
- java 多路分发
1.概念 一个函数处理多种类型,其实和多态差不多. 但是要处理两种或者多种类型的数据时,就需要判断每种类型以及每种类型所对应的处理.(PS:我只是在走别人的老路,网上一搜这种概念,博客一大堆,我不知道 ...
- JDBC处理大数据
1.处理大文本 package com.demo; import java.io.File; import java.io.FileNotFoundException; import java.io. ...
- selenium webdriver API详解(三)
本系列主要讲解webdriver常用的API使用方法(注意:使用前请确认环境是否安装成功,浏览器驱动是否与谷歌浏览器版本对应) 一:获取页面元素的文本内容:text 例:获取我的博客名字文本内容 代码 ...
- appium -- 页面出现弹窗,关闭后,无法识别页面元素(转)
原文:https://www.cnblogs.com/leavescy/p/9733001.html; 1. 问题:如图所示:在修改手势密码的过程中,点击了返回按钮后,弹出该弹窗:点击继续设置后,就发 ...
- Jmeter接口测试(一) Jmeter简介
一.Jmeter介绍 (一)Jmeter简介 Apache JMeter 是 Apache 组织的开放源代码项目,是一个纯 Java 桌面应用,用于压力测试和性能测试.它最初被设计用于 Web 应用测 ...
- jenkens其实是代码上传工具
Jenkins 持续集成使用教程 用 jenkins 有什么好处 通过规范化来完成,简单,繁琐,浪费时间的重复工作 规范化工作,以免出现低级错误 实现随时随地任何人一键构建 ...... 安装 jen ...