bzoj 3996: [TJOI2015]线性代数 最小割
2017-09-16 11:21
381 查看
题意
给出一个N*N的矩阵B和一个1*N的矩阵C。求出一个1*N的01矩阵A.使得D=(A*B-C)*A^T最大。其中A^T为A的转置。输出D
矩阵B和矩阵C中每个数字都是不超过1000的非负整数。
n<=500
分析
展开之后不难发现答案就是∑i=1n∑j=1nAi∗Bi,j∗Aj−∑i=1nCi∗Ai。那么模型就转化成了给n件物品,每件物品有一个消耗,每选择两个物品i,j就可以得到Bi,j的收益。问最大收益。
网上的巨佬们都说这是最小割经典模型,然而我感觉我并没有见过?!果然我还是太菜了吗。
从s到(i,j)连一条流量为Bi,j的边,(i,j)到i和j分别连一条流量为inf的边,i到t连一条流量为Ci的边,那么答案就是B数组的和-最小割。
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N=300005; const int inf=0x3f3f3f3f; int n,cnt,last ,dis ,s,t,cur ,ans; struct edge{int to,next,c;}e[N*10]; queue<int> que; int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int point(int x,int y) { return (x-1)*n+y; } void addedge(int u,int v,int c) { e[++cnt].to=v;e[cnt].c=c;e[cnt].next=last[u];last[u]=cnt; e[++cnt].to=u;e[cnt].c=0;e[cnt].next=last[v];last[v]=cnt; } bool bfs() { for (int i=s;i<=t;i++) dis[i]=0; while (!que.empty()) que.pop(); que.push(s);dis[s]=1; while (!que.empty()) { int u=que.front();que.pop(); for (int i=last[u];i;i=e[i].next) if (e[i].c&&!dis[e[i].to]) { dis[e[i].to]=dis[u]+1; if (e[i].to==t) return 1; que.push(e[i].to); } } return 0; } int dfs(int x,int maxf) { if (x==t||!maxf) return maxf; int ret=0; for (int &i=cur[x];i;i=e[i].next) if (e[i].c&&dis[e[i].to]==dis[x]+1) { int f=dfs(e[i].to,min(e[i].c,maxf-ret)); e[i].c-=f; e[i^1].c+=f; ret+=f; if (maxf==ret) break; } return ret; } int dinic() { int ans=0; while (bfs()) { for (int i=s;i<=t;i++) cur[i]=last[i]; ans+=dfs(s,inf); } return ans; } int main() { n=read();s=0;t=n*n+n+1;cnt=1; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) { int x=read(); ans+=x; addedge(s,point(i,j),x); addedge(point(i,j),i+n*n,inf); addedge(point(i,j),j+n*n,inf); } for (int i=1;i<=n;i++) { int x=read(); addedge(i+n*n,t,x); } printf("%d",ans-dinic()); return 0; }
相关文章推荐
- 【BZOJ 3996】 3996: [TJOI2015]线性代数 (最小割)
- bzoj3996 [TJOI2015]线性代数(最小割)
- 【BZOJ3996】线性代数(TJOI2015)-最小割
- [BZOJ3996]TJOI2015线性代数|最小割
- 【bzoj3996】【TJOI2015】【线性代数】【最小割】
- bzoj 3996: [TJOI2015]线性代数 [最小割]
- 【BZOJ3996】【TJOI2015】线性代数 最小割
- BZOJ 3996 TJOI 2015 线性代数 最小割
- 【BZOJ3996】[TJOI2015]线性代数【最小割】
- BZOJ 3996: [TJOI2015]线性代数 最大权闭合子图 最小割
- 3996: [TJOI2015]线性代数|最小割
- [bzoj] 3996 [TJOI2015]线性代数
- BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图
- 【bzoj3996】[TJOI2015]线性代数
- 【bzoj3996】[TJOI2015]线性代数 最大权闭合图
- BZOJ 3996 TJOI2015 线性代数 网络流
- bzoj3996[TJOI2015]线性代数 网络流
- [BZOJ 3996][TJOI2015]线性代数
- BZOJ3996 [TJOI2015]线性代数 【最小割】
- BZOJ3996 [TJOI2015]线性代数