[TJOI2015]线性代数
OJ题号:
BZOJ3996
题目大意:
给定一个矩阵$B_{nn}$,矩阵$C_{1n}$,存在一个01矩阵$A_{1,n}$使得$d=(A\times B-c)\times A^\mathsf{T}$最大,求$d$的最大值。
思路:
化简以后可以得到$d=\displaystyle{\sum_{i=1}^{n}\sum_{j=1}^{n}}a_ia_jb_{ij}-\displaystyle{\sum_{i=1}^{n}}a_ic_i$。
由于$A$是一个01矩阵,因此我们可以将这题转化为“取物品”的问题。
已知有$n$个物品,取第$i$个有$c_i$的收益,若同时取$i$和$j$则有$c_i+c_j+b_{ij}$的收益,求最大收益。
我们先设置超级源汇$S$和$T$,然后对于所有的$(i,j)$,连一条从$S$到$(i,j)$的容量为$b_{ij}$的边,再分别连从$(i,j)$到$i$和$j$的容量为$\infty$的边。
对于每一个$i$,连一条从$i$到$T$的容量为$c_i$的边。
然后求出最小割$f$,则$d=\displaystyle{\sum_{i=1}^n\sum_{j=1}^n}b_{ij}-f$。
然后用Edmonds-Karp算法写了一遍发现TLE了,改成用Dinic加上当前弧优化就能AC了。
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int inf=0x7fffffff;
const int E=,V=;
int s,t;
struct Edge {
int from,to,remain;
};
int sz=;
Edge e[E];
std::vector<int> g[V];
inline void add_edge(const int u,const int v,const int w) {
e[sz]=(Edge){u,v,w};
g[u].push_back(sz);
sz++;
}
int lev[V];
inline void bfs() {
for(int i=;i<=t;i++) lev[i]=inf;
lev[s]=;
std::queue<int> q;
q.push(s);
while(!q.empty()) {
int x=q.front();
q.pop();
for(unsigned i=;i<g[x].size();i++) {
Edge &y=e[g[x][i]];
if(y.remain&&lev[y.to]==inf) {
lev[y.to]=lev[x]+;
q.push(y.to);
}
}
}
}
unsigned cur[V]={};
int dfs(const int x,const int flow) {
if(x==t) return flow;
for(unsigned &i=cur[x];i<g[x].size();i++) {
Edge y=e[g[x][i]];
if(y.remain&&lev[x]<lev[y.to]) {
int f=dfs(y.to,std::min(flow,y.remain));
if(f) {
e[g[x][i]].remain-=f;
e[g[x][i]^].remain+=f;
return f;
}
}
}
return ;
}
inline int Dinic() {
int maxflow=;
for(;;) {
bfs();
if(lev[t]==inf) break;
while(int flow=dfs(s,inf)) {
maxflow+=flow;
}
}
return maxflow;
}
int main() {
int n=getint();
s=,t=n*(n+)+;
int ans=;
for(int i=;i<=n;i++) {
for(int j=;j<=n;j++) {
int id=i*n+j;
int w=getint();
ans+=w;
add_edge(s,id,w);
add_edge(id,s,);
add_edge(id,i,inf);
add_edge(i,id,);
add_edge(id,j,inf);
add_edge(j,id,);
}
}
for(int i=;i<=n;i++) {
add_edge(i,t,getint());
add_edge(t,i,);
}
printf("%d\n",ans-Dinic());
return ;
}
Edmonds-Karp的TLE代码:
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int inf=0x7fffffff;
const int E=,V=;
int s,t;
struct Edge {
int from,to,remain;
};
int sz=;
Edge e[E];
std::vector<int> g[V];
inline void add_edge(const int u,const int v,const int w) {
e[sz]=(Edge){u,v,w};
g[u].push_back(sz);
sz++;
}
int a[V],p[V];
inline int Augment() {
memset(a,,sizeof a);
a[s]=inf;
std::queue<int> q;
q.push(s);
while(!q.empty()) {
int x=q.front();
q.pop();
for(unsigned i=;i<g[x].size();i++) {
Edge &y=e[g[x][i]];
if(y.remain&&!a[y.to]) {
a[y.to]=std::min(a[x],y.remain);
p[y.to]=g[x][i];
q.push(y.to);
}
}
if(a[t]) break;
}
return a[t];
}
inline int EdmondsKarp() {
int maxflow=;
while(int flow=Augment()) {
for(int i=t;i!=s;i=e[p[i]].from) {
e[p[i]].remain-=flow;
e[p[i]^].remain+=flow;
}
maxflow+=flow;
}
return maxflow;
}
int main() {
int n=getint();
s=,t=n*(n+)+;
int ans=;
for(int i=;i<=n;i++) {
for(int j=;j<=n;j++) {
int id=i*n+j;
int w=getint();
ans+=w;
add_edge(s,id,w);
add_edge(id,s,);
add_edge(id,i,inf);
add_edge(i,id,);
add_edge(id,j,inf);
add_edge(j,id,);
}
}
for(int i=;i<=n;i++) {
add_edge(i,t,getint());
add_edge(t,i,);
}
printf("%d\n",ans-EdmondsKarp());
return ;
}
[TJOI2015]线性代数的更多相关文章
- 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_ ...
- 【BZOJ 3996】 3996: [TJOI2015]线性代数 (最小割)
3996: [TJOI2015]线性代数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1368 Solved: 832 Description 给 ...
- [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的 ...
- [TJOI2015]线性代数(网络流)
[TJOI2015]线性代数(最大权闭合子图,网络流) 为了提高智商,ZJY开始学习线性代数.她的小伙伴菠萝给她出了这样一个问题:给定一个n*n的矩阵B和一个1×n的矩阵C.求出一个1×n的01矩阵A ...
- 洛谷P3973 - [TJOI2015]线性代数
Portal Description 给定一个\(n\times n\)的矩阵\(B\)和一个\(1×n\)的矩阵\(C\).求出一个\(1×n\)的01矩阵\(A\),使得\(D=(A×B-C)×A ...
- 【BZOJ】3996: [TJOI2015]线性代数
题意 给出一个\(N \times N\)的矩阵\(B\)和一个\(1 \times N\)的矩阵\(C\).求出一个\(1 \times N\)的01矩阵\(A\),使得\[ D = ( A * B ...
随机推荐
- 转:IOS 基于APNS消息推送原理与实现(JAVA后台)
Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple ...
- bzoj千题计划181:bzoj1878: [SDOI2009]HH的项链
http://www.lydsy.com/JudgeOnline/problem.php?id=1878 之前用莫队做的,现在用树状数组 把每种数的第一个出现位置在树状数组中+1 nxt[i] 记录i ...
- python 基础 元组()
# 元组 应用场景 # 尽管 Python的列表中可以存储不同类型的数据 # 但是在开发中,更多的应用场景是 # 1.列表存储相同类型的数据 # 2.通过迭代遍历,在循环体内部,针对列表中的每一项元素 ...
- Python 装饰器入门(上)
翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...
- 第9月第9天 CTFramesetterCreateWithAttributedString
1. NSString *text = @"This\nis\nsome\nmulti-line\nsample\ntext."; UIFont *uiFont = [UIFont ...
- nested exception is com.svorx.core.dao.PersistenceException
在quartz定时执行任务的时候,hibernate报错,在只读事务中进行了update语句: [ERROR] 2018/08/03 10:35:00,827 org.quartz.core.JobR ...
- mybatis输入输出映射——(五)
0.#{}与${}区别 #{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?. <!-- 根据id查询用户信息 --> < ...
- 刘昕鑫 C# 特性详解
C# 特性详解 特性(attribute)是被指定给某一声明的一则附加的声明性信息. 在C#中,有一个小的预定义特性集合.在学习如何建立我们自己的定制特性(custom attributes)之前,我 ...
- MongoDB:数据导入CSV文件之错误记录
测试主机1:Windows 10,MongoDB 3.6.3,WPS 10.1,Notepad++ 7.5.3, 测试主机2:Ubuntu 16.04,MongoDB 4, 今天测试了将数据从文件—— ...
- 如何将同一个APP中的不同activity在Recent(最近任务)中显示?
需求描述 在应用Application1中存在A.B两个activity,当在应用启动了A.B activity,点击Recent键,如何让A.B两个activity都显示在Recent界面(最近任务 ...