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 分析: 这道题比较绕,我们需要看清题目中那个式子的本 ...
随机推荐
- clipboard.js使用方法
HTML data-clipboard-action=“ copy ” 或者“cut” data-clipboard-target="#domName" data-clipboa ...
- iOS-不用微信SDK唤起微信支付
作者:TianBai 原文链接:http://www.jianshu.com/p/8930b4496023 要想知道微信SDK是如何调起微信客户端,那么咱们先看看微信SDK到底做了什么 前期准备 接入 ...
- 基于vue-cli,测试非父子传值时,碰到 keep-alive的神奇
非父子传值测试 一直都很好奇非父子传值到底如何,结果入坑许久才爬出来,才知道在脚手架里测试就是坑. 问题: 测试非父子传值时,由于组件之间是通过路由进行跳转,值传过去又被刷掉 思路: 因为路由跳转,相 ...
- yum的搭建
搭建本地yum仓库的步骤 . 创建光盘目录,挂载光盘 . 进入/etc/yum/repos.d目录下,备份所有配置文件 . 利用一个含有大写M的配置文件作为配置文件的模板 . 在模板里将enabled ...
- poj21516
首先对于一种商品 如果这种货不足需求就直接输出-1 剩下的就是KM算法 分k次分别计算每种商品的最小权值匹配 代码: #include<cstdio> #include<cstrin ...
- 【LeetCode 110_二叉树_遍历】Balanced Binary Tree
解法一:From top to bottom int treeHeight(TreeNode *T) { if (T == NULL) ; ; } bool isBalanced(TreeNode* ...
- java 静态代理 JDK动态代理 Cglib动态代理
下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行 ...
- gcc中关于静态库和动态库使用(转)
转自:http://blog.chinaunix.net/uid-25871104-id-3069931.html 1,如何生成静态库 静态库只是一堆object对象的集合,使用ar命令可以将.o文件 ...
- SDP协议简述
SDP协议也是文本协议,只需要按照协议本身的格式填充.SDP协议格式即详细信息如下: 会话描述 格式及举例 v=(protocol version) v=0 o=(owner/creator and ...
- wordpress 生成自定义 meta box
工具 https://jeremyhixon.com/tool/wordpress-meta-box-generator/ 使用 生成代码 /** * Generated by the WordPre ...