bzoj3996[TJOI2015]线性代数 网络流
2017-08-03 09:32
375 查看
Description
给出一个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
输出最大的D
Sample Input
3
1 2 1
3 1 0
1 2 3
2 3 7
Sample Output
2
HINT
1<=N<=500
Source
(A*B-C)*A^T=A*B*A^T-C*A^T;
然后转化一下模型。
有n个物品,B表示选两个的收益,C表示每个物品的代价,求最大收益。
这是经典的最小割模型。
连边:S向num(i,j)连容量为bi,j的边。
i,j分别向num(i,j)连容量为inf的边.
连边i到T,容量为Ci.
给出一个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
输出最大的D
Sample Input
3
1 2 1
3 1 0
1 2 3
2 3 7
Sample Output
2
HINT
1<=N<=500
Source
(A*B-C)*A^T=A*B*A^T-C*A^T;
然后转化一下模型。
有n个物品,B表示选两个的收益,C表示每个物品的代价,求最大收益。
这是经典的最小割模型。
连边:S向num(i,j)连容量为bi,j的边。
i,j分别向num(i,j)连容量为inf的边.
连边i到T,容量为Ci.
#include<cstdio> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) #define inf 1000000000 using namespace std; const int N=3e5+5; typedef long long ll; int dis ,head ,go[2000005],next[2000005]; int val[2000005]; int q ,n,T,tot=1,cnt,id; inline void add(int x,int y,int z) { go[++tot]=y; next[tot]=head[x]; val[tot]=z; head[x]=tot; } inline void ins(int x,int y,int z) { add(x,y,z); add(y,x,0); } inline bool bfs() { int t=0,w=1; memset(dis,-1,sizeof(dis)); q[1]=0,dis[0]=0; while (t<w) { int x=q[++t]; for(int i=head[x];i;i=next[i]) { int v=go[i]; if (val[i]&&dis[v]==-1) { dis[v]=dis[x]+1; q[++w]=v; } } } return dis[T]!=-1; } inline int dfs(int x,int f) { if (x==T)return f; int w,used=0; for(int i=head[x];i;i=next[i]) { int v=go[i]; if (dis[v]==dis[x]+1) { w=f-used; w=dfs(v,min(w,val[i])); val[i]-=w; val[i^1]+=w; used+=w; if (used==f)return f; } } if (!used)dis[x]=-1; return used; } inline int dinic() { int ans=0; while (bfs())ans+=dfs(0,inf); return ans; } int main() { scanf("%d",&n); T=n+n*n+1; id=n; fo(i,1,n) { fo(j,1,n) { int x; scanf("%d",&x); ++id; ins(i,id,inf); ins(j,id,inf); ins(id,T,x); cnt+=x; } } fo(i,1,n) { int x; scanf("%d",&x); ins(0,i,x); } printf("%d\n",cnt-dinic()); return 0; }
相关文章推荐
- BZOJ 3996 TJOI2015 线性代数 网络流
- bzoj 3996: [TJOI2015]线性代数 最小割
- 【BZOJ3996】线性代数(TJOI2015)-最小割
- 【bzoj3996】[TJOI2015]线性代数 最大权闭合图
- 【bzoj3996】[TJOI2015]线性代数
- bzoj3996 [TJOI2015]线性代数(最小割)
- BZOJ3996 [TJOI2015]线性代数
- [BZOJ 3996][TJOI2015]线性代数
- BZOJ 3996: [TJOI2015]线性代数(最大权闭合子图)
- BZOJ 3996: [TJOI2015]线性代数
- 【BZOJ3996】[TJOI2015]线性代数【最小割】
- [BZOJ3996]TJOI2015线性代数|最小割
- BZOJ 3996: [TJOI2015]线性代数 最大权闭合子图 最小割
- BZOJ 3996: [TJOI2015]线性代数
- BZOJ 3996 TJOI 2015 线性代数 最小割
- BZOJ3996: [TJOI2015]线性代数 解题报告
- 【BZOJ3996】[TJOI2015]线性代数 最大权闭合图
- 【BZOJ 3996】 3996: [TJOI2015]线性代数 (最小割)
- 【BZOJ3996】【TJOI2015】线性代数 最小割
- 【bzoj3996】【TJOI2015】【线性代数】【最小割】