[BZOJ 3996] [TJOI 2015] 线性代数
2015-06-12 11:15
211 查看
3996: [TJOI2015]线性代数
Time Limit: 10 SecMemory Limit: 128 MBDescription
给出一个N*N的矩阵B和一个1*N的矩阵C。求出一个1*N的01矩阵A.使得D=(A*B-C)*A^T最大。其中A^T为A的转置。输出D
Input
第一行输入一个整数N,接下来N行输入B矩阵,第i行第J个数字代表Bij.接下来一行输入N个整数,代表矩阵C。矩阵B和矩阵C中每个数字都是不超过1000的非负整数。
Output
输出最大的DSample Input
31 2 1
3 1 0
1 2 3
2 3 7
Sample Output
2HINT
1<=N<=500【题解】
花了好久时间化简,最后化简出来是
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #include<set> #include<map> #include<bitset> #include<vector> using namespace std; #define PA pair<int,int> const int N=0,M=0; inline int read() {int s=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+ch-'0';ch=getchar();} return s*f; } int n,np,x[505][505],S,T,h[505][505],d[130005];long long ans; int be[130005],bv[2000005],bl[2000005],bn[2000005],bw=1; void put(int u,int v,int l) {++bw;bn[bw]=be[u];be[u]=bw;bv[bw]=v;bl[bw]=l;} void in() {scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {int s=read(); x[max(i,j)][min(i,j)]+=s; if(i!=j)ans+=s; } for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) h[i][j]=++np; S=++np,T=++np; for(int i=1;i<=n;i++) {x[i][i]-=read(); if(x[i][i]>0)ans+=x[i][i]; else put(S,h[i][i],x[i][i]*-1),put(h[i][i],S,0); } for(int i=1;i<=n;i++) {for(int j=1;j<i;j++) put(h[i][i],h[i][j],min(x[i][i]*-1,x[i][j])),put(h[i][j],h[i][i],0); for(int j=i+1;j<=n;j++) put(h[i][i],h[j][i],min(x[i][i]*-1,x[j][i])),put(h[j][i],h[i][i],0); } for(int i=1;i<=n;i++) for(int j=1;j<i;j++) if(x[i][j]) put(h[i][j],T,x[i][j]),put(T,h[i][j],0); } int dfs(int x,int sum) { if(x==T)return sum; int ans=0,f=0; for(int i=be[x];i;i=bn[i]) if(bl[i]) if(d[bv[i]]==d[x]+1) {f=dfs(bv[i],min(sum,bl[i])); ans+=f; sum-=f; bl[i]-=f; bl[i^1]+=f; if(!sum)return ans; } return ans; } queue<int>q; int bfs() {q.push(S); for(int i=1;i<=np;i++) d[i]=5000000; d[S]=1;q.push(S); while(!q.empty()) {int u=q.front();q.pop(); for(int i=be[u];i;i=bn[i]) if(d[bv[i]]>d[u]+1&&bl[i]) {d[bv[i]]=d[u]+1; q.push(bv[i]); } } return dfs(S,500000); } int main() { freopen("algebra.in","r",stdin); freopen("algebra.out","w",stdout); in(); int s=0; while(s=bfs())ans-=s; printf("%d",ans); return 0; }
View Code
这是我在BZOJ AC的第10题,仅此纪念 2015/6/12
相关文章推荐
- openstack学习之知识准备
- 深入理解Linux守护进程
- java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receiv
- cookie的用法
- 设计Information Dashboard的十条“戒律”
- 初识
- gulp-uglify《JS压缩》----gulp系列(四)
- 新GRE满分作文——现代摄像机和印刷术
- Android:自定义标题栏(titlebar)
- java如何得到GET和POST请求URL和参数列表
- CloudXNS之初体验
- openstack学习之概念篇
- 国产手机新一轮洗牌:高端市场进入肉搏战
- Android应用开发提高篇(3)-----传感器(Sensor)编程(转)
- DWCS6搭建jsp开发环境及使用ajax实现用户注册(基于文件)
- soa部署项目,启动时报错:No credential mapper entry found for password indirection user
- LAMP环境搭建3-PHP5.6
- 查询数据库
- 常用的数据挖掘&机器学习知识点
- C++文件操作详解