3997: [TJOI2015]组合数学

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 405  Solved: 284
[Submit][Status][Discuss]

Description

给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走。问至少走多少次才能将财宝捡完。此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完。

 

Input

第一行为正整数T,代表数据组数。

每组数据第一行为正整数N,M代表网格图有N行M列,接下来N行每行M个非负整数,表示此格子中财宝数量,0代表没有

Output

输出一个整数,表示至少要走多少次。

 

Sample Input

1
3 3
0 1 5
5 0 0
1 0 0

Sample Output

10

HINT

N<=1000,M<=1000.每个格子中财宝数不超过10^6

Source

把公式写出来就是∑ni=1∑nj=1Bij×Ai×Aj–∑ni=1Ai×Ci

于是可以看出是一个最大权闭合图,我要获得bij这个点的收益就要付出ci和cj的费用。

经典的最小割。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define clr(x,y) memset(x,y,sizeof(x));
#define maxn 505
#define maxm 505500
#define inf int(1e9)
using namespace std;
struct data{int obj;int pre;int c;
}e[3005000];
int head[maxm],b[maxn][maxn],c[maxn],uu[maxm],s,t,n,sum,tot=1,q[3005000];
void insert(int x,int y,int z){
e[++tot].obj=y; e[tot].c=z; e[tot].pre=head[x]; head[x]=tot;
e[++tot].obj=x; e[tot].c=0; e[tot].pre=head[y]; head[y]=tot;
}
bool bfs(){
clr(uu,-1);
int l=0,r=1; q[1]=s; uu[s]=0;
while (l<r){
int u=q[++l];
for(int j=head[u];j;j=e[j].pre){
int v=e[j].obj;
if (uu[v]==-1&&e[j].c>0) {
q[++r]=v; uu[v]=uu[u]+1;
}
}
}
if (uu[t]<0) return 0;
return 1;
}
int dfs(int u,int mx){
int used=0,w;
if (u==t||mx==0) return mx;
for(int j=head[u];j;j=e[j].pre){
int v=e[j].obj;
if (uu[v]==uu[u]+1&&e[j].c>0){
w=dfs(v,min(mx-used,e[j].c));
if (w<=0) {uu[v]=-1; continue;}
e[j].c-=w; e[j^1].c+=w; used+=w;
if (used==mx) return used;
}
}
return used;
}
int dinic(){
int ans=0;
while (bfs())
ans+=dfs(s,inf);
return ans;
}
int main(){
scanf("%d",&n);
s=0; t=n+n*n+1;
rep(i,1,n)
rep(j,1,n)
scanf("%d",&b[i][j]),sum+=b[i][j];
rep(i,1,n) scanf("%d",&c[i]),insert(n*n+i,t,c[i]);
rep(i,1,n){
rep(j,1,n){
insert(s,(i-1)*n+j,b[i][j]);
insert((i-1)*n+j,n*n+i,inf);
insert((i-1)*n+j,n*n+j,inf);
}
}
printf("%d\n",sum-dinic());
return 0;
}

BZOJ3997: [TJOI2015]组合数学(网络流)的更多相关文章

  1. bzoj3997[TJOI2015]组合数学

    http://www.lydsy.com/JudgeOnline/problem.php?id=3997 偏序集,看上一篇随笔. 我们要求最少路径覆盖,可以等价于求最大独立集. 我们要找到一个权值和最 ...

  2. BZOJ3997 TJOI2015组合数学(动态规划)

    copy: Dilworth定理:DAG的最小链覆盖=最大点独立集 最小链覆盖指选出最少的链(可以重复)使得每个点都在至少一条链中 最大点独立集指最大的集合使集合中任意两点不可达 此题中独立的定义即是 ...

  3. [BZOJ3997][TJOI2015]组合数学(Dilworth定理+DP)

    题目名字是什么就不能往那方面想. 每个点拆成a[i][j]个,问题变为DAG最小路径覆盖,由Dilworth定理转成最长反链. 使用Dilworth定理的时候要注意那些点之间有边,这里任意一个点和其右 ...

  4. bzoj3997[TJOI2015]组合数学(求最长反链的dp)

    组合数学 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走 ...

  5. bzoj千题计划298:bzoj3997: [TJOI2015]组合数学

    http://www.lydsy.com/JudgeOnline/problem.php?id=3997 最小链覆盖=最长反链长度 所以题目等价于寻找一条从右上角到左下角的最长路 #include&l ...

  6. BZOJ3997:[TJOI2015]组合数学(DP,Dilworth定理)

    Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一 ...

  7. BZOJ3997 [TJOI2015]组合数学 【Dilworth定理】

    题目 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少 ...

  8. 【BZOJ3997】[TJOI2015]组合数学(动态规划)

    [BZOJ3997][TJOI2015]组合数学(动态规划) 题面 BZOJ 洛谷 题解 相当妙的一道题目.不看题解我只会暴力网络流 先考虑要求的是一个什么东西,我们把每个点按照\(a[i][j]\) ...

  9. 【BZOJ3997】[TJOI2015]组合数学 最长反链

    [BZOJ3997][TJOI2015]组合数学 Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格 ...

随机推荐

  1. css:background-position > 精灵技术

    background-position : length || length background-position : position || position 取值: length  : 百分数 ...

  2. ArcGIS 网络分析[2.4] OD成本矩阵

    什么是OD成本矩阵? 先不说这个东西是什么,我们还是举一个实际的例子: 现在存在3个城市北京.上海.武汉,请分析他们两两之间的通行时间. 很简单嘛!北京到上海,北京到武汉,上海到武汉都来一次最短路径分 ...

  3. Effective Java 第三版——13. 谨慎地重写 clone 方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  4. python3 python2 import 的区别

    https://stackoverflow.com/questions/12172791/changes-in-import-statement-python3

  5. ubuntu 安装 pythonenv

    This will get you going with the latest version of pyenv and make it easy to fork and contribute any ...

  6. 我知道你不知道的负Margin

    现如今,负margin技术的应用可谓越来越广,任一个大型站点惊鸿一瞥之下都会有其身影所在.个人认为负margin技术是学习css路上必不可缺少的课题之一,许多高级应用及疑难杂症修复都可以使用负marg ...

  7. thinkphp 官方文件执行引入流程

    官方手册上的执行流程图: 系统流程 用户URL请求 调用应用入口文件(通常是网站的index.php) 载入框架入口文件(ThinkPHP.php) 记录初始运行时间和内存开销 系统常量判断及定义 载 ...

  8. Sql 两个表left join 查左表最时间最大的一条记录显示

    http://bbs.csdn.net/topics/350135010 参考 select *  from a aa left join b bb on aa.id=bb.cid and bb.ad ...

  9. Django__WSGI

    WEB应用的本质 : 1. 浏览器发送一个http请求 2. 服务器收到请求,生成一个html文档 3. 服务器把HTML文档作为HTTP响应的body发送给浏览器 4. 浏览器收到http响应,从h ...

  10. Django__Ready

    Python WEB框架 : DJango : 大而全 flask : 小而精 tornado : 下载DJango : PIP3 INSTALL DJANGO 创建DJango项目 : django ...