洛谷P3973 - [TJOI2015]线性代数
2018-03-22 13:14
232 查看
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?!
相关文章推荐
- BZOJ3996: [TJOI2015]线性代数
- BZOJ3996 [TJOI2015]线性代数 【最小割】
- [TJOI2015]线性代数
- ●BZOJ 3996 [TJOI2015]线性代数
- bzoj3996 [TJOI2015]线性代数
- 【BZOJ】3996: [TJOI2015]线性代数
- bzoj3996 [TJOI2015]线性代数
- bzoj3996 [TJOI2015]线性代数
- 3996: [TJOI2015]线性代数
- bzoj 3996: [TJOI2015]线性代数
- 【BZOJ】【TJOI2015】线性代数
- bzoj 3996: [TJOI2015]线性代数
- BZOJ 3996 [TJOI 2015] 线性代数 解题报告
- 洛谷P3975 - [TJOI2015]弦论
- MIT_线性代数笔记_07_求解Ax=0:主变量、特解
- 线性代数导论1——方程组的几何解释
- 3997: [TJOI2015]组合数学
- 【bzoj3996】[TJOI2015]线性代数
- 线性代数 -- 矩阵空间、秩1矩阵、小世界图
- 【线性代数公开课MIT Linear Algebra】 第八课 Ax=b,我们的核心问题