您的位置:首页 > 其它

洛谷P3973 - [TJOI2015]线性代数

2018-03-22 13:14 232 查看

Portal

Description

给定一个\(n\times n\)的矩阵\(B\)和一个\(1×n\)的矩阵\(C\)。求出一个\(1×n\)的01矩阵\(A\),使得\(D=(A×B-C)×A^T\)最大,其中\(A^T\)为\(A\)的转置。输出\(D\)。

Solution

先展开一波。
\[\begin{align*} D &= (A×B-C)×A^T \\ &= \begin{bmatrix} \sum_{i=1}^n a_ib_{i1}-c_1 & \sum_{i=1}^n a_ib_{i2}-c_2 & ... & \sum_{i=1}^n a_ib_{in}-c_n \end{bmatrix} \times A^T \\ &= \sum_{j=1}^n a_j (\sum_{i=1}^n a_ib_{ij}-c_j) \\ &= \sum_{i=1}^n \sum_{j=1}^n a_ia_jb_{ij} - \sum_{i=1}^n a_ic_i \end{align*}\] 观察发现,要想获得\(b_{ij}\)的价值就需要让\(a_i=a_j=1\),但如果\(a_i\)被选就得付出\(c_i\)的代价。那么同太空飞行计划,求最大权闭合图即可。

Code

//线性代数
#include <cstdio>
#include <cstring>
inline char gc()
{
static char now[1<<16],*S,*T;
if(S==T) {T=(S=now)+fread(now,1,1<<16,stdin); if(S==T) return EOF;}
return *S++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
int min(int x,int y) {return x<y?x:y;}
int const N=3e5;
int const INF=0x7FFFFFFF;
int n;
int cnt,h
;
struct edge{int v,c,nxt;} ed[N*6];
void edAdd(int u,int v,int c)
{
cnt++; ed[cnt].v=v,ed[cnt].c=c,ed[cnt].nxt=h[u],h[u]=cnt;
cnt++; ed[cnt].v=u,ed[cnt].c=0,ed[cnt].nxt=h[v],h[v]=cnt;
}
int s,t;
int dpt
; int Q
,op,cl;
bool bfs()
{
memset(dpt,0,sizeof dpt);
dpt[s]=1,Q[++cl]=s;
while(op<cl)
{
int u=Q[++op]; if(u==t) break;
for(int i=h[u];i;i=ed[i].nxt)
{
int v=ed[i].v;
if(!dpt[v]&&ed[i].c) dpt[v]=dpt[u]+1,Q[++cl]=v;
}
}
return dpt[t];
}
int fill(int u,int in)
{
if(u==t) return in;
int out=0;
for(int i=h[u];i&&in>out;i=ed[i].nxt)
{
int v=ed[i].v,c=ed[i].c;
if(!c||dpt[v]!=dpt[u]+1) continue;
int fl=fill(v,min(in-out,c));
if(!fl) dpt[v]=0;
else out+=fl,ed[i].c-=fl,ed[i^1].c+=fl;
}
return out;
}
int maxFlow()
{
int res=0;
while(bfs()) res+=fill(s,INF);
return res;
}
int main()
{
n=read(); int ans=0;
s=0,t=n*n+n+1; cnt=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int u=(i-1)*n+j,c=read(); ans+=c;
edAdd(s,u,c); edAdd(u,n*n+i,INF),edAdd(u,n*n+j,INF);
}
for(int i=1;i<=n;i++) edAdd(n*n+i,t,read());
printf("%d\n",ans-maxFlow());
return 0;
}

P.S.

洛谷A了,原数据A了,但BZOJ上RE?!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: