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]线性代数的更多相关文章

  1. bzoj 3996: [TJOI2015]线性代数 [最小割]

    3996: [TJOI2015]线性代数 题意:给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 \(D=(A * B-C)* A^T\)最大.其中A^T为A的转置.输出D.每 ...

  2. BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图

    BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大. ...

  3. 【BZOJ3996】[TJOI2015]线性代数(最小割)

    [BZOJ3996][TJOI2015]线性代数(最小割) 题面 BZOJ 洛谷 题解 首先把式子拆开,发现我们的答案式就是这个: \[\sum_{i=1}^n\sum_{j=1}^n B_{i,j} ...

  4. 【LG3973】[TJOI2015]线性代数

    [LG3973][TJOI2015]线性代数 题面 洛谷 题解 正常解法 一大堆矩阵乘在一起很丑对吧 化一下柿子: \[ D=(A*B-C)*A^T\\ \Leftrightarrow D=\sum_ ...

  5. 【BZOJ 3996】 3996: [TJOI2015]线性代数 (最小割)

    3996: [TJOI2015]线性代数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1368  Solved: 832 Description 给 ...

  6. [Luogu 3973] TJOI2015 线性代数

    [Luogu 3973] TJOI2015 线性代数 这竟然是一道最小割模型. 据说是最大权闭合子图. 先把矩阵式子推出来. 然后,套路建模就好. #include <algorithm> ...

  7. 【BZOJ3996】[TJOI2015]线性代数 最大权闭合图

    [BZOJ3996][TJOI2015]线性代数 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的 ...

  8. [TJOI2015]线性代数(网络流)

    [TJOI2015]线性代数(最大权闭合子图,网络流) 为了提高智商,ZJY开始学习线性代数.她的小伙伴菠萝给她出了这样一个问题:给定一个n*n的矩阵B和一个1×n的矩阵C.求出一个1×n的01矩阵A ...

  9. 洛谷P3973 - [TJOI2015]线性代数

    Portal Description 给定一个\(n\times n\)的矩阵\(B\)和一个\(1×n\)的矩阵\(C\).求出一个\(1×n\)的01矩阵\(A\),使得\(D=(A×B-C)×A ...

  10. 【BZOJ】3996: [TJOI2015]线性代数

    题意 给出一个\(N \times N\)的矩阵\(B\)和一个\(1 \times N\)的矩阵\(C\).求出一个\(1 \times N\)的01矩阵\(A\),使得\[ D = ( A * B ...

随机推荐

  1. <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible' />

    代码一:<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> http-eq ...

  2. 深入了解C指针

      前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级 ...

  3. SQL语句(十四)子查询

    --1. 使用IN关键字 --例1 查询系别人数不足5人的系别中学生的学号.姓名和系别 --系别人数不足5人的系别 ==>选择条件 select Sdept from Student Group ...

  4. 使用 maven 搭建web开发基本架构

    我觉得可能,对于还没有使用过 IDEA 进行开发的童鞋来说,直接撸代码是有些尴尬的.那么我会把示例代码之前的那些事再在这里写一遍 按图步骤进行即可进行基本项目结构搭建 现在基本流行 maven 管理项 ...

  5. Liberty Mutual Property Inspection, Winner's Interview: Qingchen Wang

    Liberty Mutual Property Inspection, Winner's Interview: Qingchen Wang The hugely popular Liberty Mut ...

  6. html5 canvas文本处理

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. javascript 简单工厂模式

    var Bicycle = new Interface("Bicycle",["assemble","wash","ride&qu ...

  8. the error about “no such file or directory”

    CHENYILONG Blog the error about "no such file or directory" when you get the question like ...

  9. Python super() 函数

    super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果重定义某个方法,该方法会覆盖父类的同名方法,但有时 ...

  10. 第6月第4天 AVMutableComposition AVMutableVideoComposition

    1. AVMutableComposition is a mutable subclass of AVComposition you use when you want to create a new ...