bzoj 3996 [TJOI2015]线性代数——最小割
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3996
b[ i ][ j ] 要计入贡献,当且仅当 a[ i ] = 1 , a[ j ] = 1 ;-c[ i ] 要计入贡献,当且仅当 a[ i ] = 1;所以建一排 b 的点,建一排 a 的点,源点向 b 的点连它们价值容量的边,b 向它对应的两个 a 连 INF ; a 向汇点连它对应的 c 容量的边;割源点到 b 的边表示不选该 b ,割 a 到汇点的边表示选该 a 。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=,N=*+,INF=N*;
int n,cnt,hd[N],xnt=,cur[N],ans;
int dfn[N],q[N],he,tl;bool vis[N];
struct Ed{
int to,nxt,cap;
Ed(int a=,int b=,int c=):to(a),nxt(b),cap(c) {}
}ed[N*];
void add(int x,int y,int z)
{
ed[++xnt]=Ed(y,hd[x],z);hd[x]=xnt;
ed[++xnt]=Ed(x,hd[y],);hd[y]=xnt;
}
bool bfs()
{
memset(dfn,,sizeof dfn);
q[he=tl=]=;vis[]=;dfn[]=;
while(he<=tl)
{
int k=q[he++];vis[k]=;//he++
for(int i=hd[k],v;i;i=ed[i].nxt)
if(!dfn[v=ed[i].to]&&ed[i].cap)
dfn[v]=dfn[k]+,q[++tl]=v;
}
return dfn[cnt];
}
int dinic(int cr,int flow)
{
if(cr==cnt)return flow;
int use=;
for(int& i=cur[cr],v;i;i=ed[i].nxt)
if(dfn[v=ed[i].to]==dfn[cr]+&&ed[i].cap)
{
int tmp=dinic(v,min(flow-use,ed[i].cap));
if(!tmp)dfn[v]=;
use+=tmp;ed[i].cap-=tmp;ed[i^].cap+=tmp;
if(use==flow)return use;
}
return use;
}
int main()
{
scanf("%d",&n);cnt=n;
for(int i=;i<=n;i++)
for(int j=,d;j<=n;j++)
{
scanf("%d",&d);cnt++;ans+=d;
add(,cnt,d);add(cnt,i,INF);
if(i!=j)add(cnt,j,INF);
}
cnt++;
for(int i=,d;i<=n;i++)
scanf("%d",&d),add(i,cnt,d);
while(bfs())memcpy(cur,hd,sizeof hd),ans-=dinic(,INF);
printf("%d\n",ans);
return ;
}
bzoj 3996 [TJOI2015]线性代数——最小割的更多相关文章
- bzoj 3996: [TJOI2015]线性代数 [最小割]
3996: [TJOI2015]线性代数 题意:给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 \(D=(A * B-C)* A^T\)最大.其中A^T为A的转置.输出D.每 ...
- bzoj 3996: [TJOI2015]线性代数【最小割】
把转置矩阵看成逆矩阵吓傻了233 首先按照矩乘推一下式子: \[ D=\sum_{i=1}^n a[i]*(\sum_{j=1}^n a[j]*b[j][i])-c[i] \] \[ D=(\sum_ ...
- ●BZOJ 3996 [TJOI2015]线性代数
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3996 题解: 好题啊.(不太熟悉矩阵相关,所以按某些博主的模型转换来理解的)首先,那个式子可 ...
- bzoj 3996: [TJOI2015]线性代数
Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D Input 第一行输入一个整数N,接 ...
- [TJOI2015]线性代数(最小割)
题目描述 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 题解 观察上面那个式子发现,当一个bij有贡献时当 ...
- BZOJ3996[TJOI2015]线性代数——最小割
题目描述 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 输入 第一行输入一个整数N,接下来N行输入B矩阵, ...
- 【BZOJ 3996】 3996: [TJOI2015]线性代数 (最小割)
3996: [TJOI2015]线性代数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1368 Solved: 832 Description 给 ...
- 【BZOJ-3996】线性代数 最小割-最大流
3996: [TJOI2015]线性代数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1054 Solved: 684[Submit][Statu ...
- BZOJ 3996 线性代数 最小割
题意: 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 分析: 这道题比较绕,我们需要看清题目中那个式子的本 ...
随机推荐
- 卸载Linux自带的JDK
Redhat Enterprise Linux中自带了jdk的旧版本,往往需要卸载,卸载步骤如下: 在终端输入:yum remove java 终端显示:Is this ok[y/N]: 输入y,按回 ...
- 【Error】IOError: [Errno 22] invalid mode ('wb') or filename
错误描述: IOError: [Errno 22] invalid mode ('wb') or filename: 'C:\\Users\\Viral Patel\\Documents\\GitHu ...
- OpenStack Mitaka Neutron SR-IOV配置
### 一.在所有节点(控制节点.计算节点) 1.修改BIOS ``` BOIS里面开启SR-IOV功能 开启 VT-d (inter virtualization technology)和 SR-I ...
- 006PHP基础知识——数据类型(三)
<?php /** * 数据类型(三) * PHP是一个弱类型的语言 */ //检测数据类型:gettype() 返回字符串的数据类型 /*$str="美丽中国"; echo ...
- laravel中的validate验证的使用案例:
第一个是设置,第二个是直接调用.
- 一点记忆—— Java框架知识的学习有感
一点记忆—— Java框架知识的学习有感 说一下自己学习的框架知识的历程吧:好久了,应该是一年前,也就是大三上的时候,我对于基本的 Java编程就已经达到所谓的“熟练”,认为自己可以在 ...
- 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- Ubuntu12.04下samba服务器共享配置
1 . 前置工作 首先保证你的Ubuntu能上网:虚拟机网络连接方式为NAT:虚拟机雨物理机互ping可通: 2. 安装samba sudo apt-get insall samba sudo apt ...
- C++开发人脸性别识别教程(6)——通过SVM实现性别识别
http://blog.csdn.net/u013088062/article/details/50480518
- jauery-layer弹出框的使用
一布局: <div id="detailLayer"> <div class="box-header"> <div class=& ...