HOJ 2713 Matrix1
Matrix1
| My Tags | (Edit) |
|---|
| Source : Classical Problem | |||
| Time limit : 5 sec | Memory limit : 64 M | ||
Submitted : 424, Accepted : 129
Lilu0355 is a thoughtful boy and always plays a classical mathematic game.The game plays like that, there is a n * m matrix, each grid of this matrix is filled with a non-negative number. You should remove some numbers from the matrix and make sure that any two numbers removed are not adjacent in the matrix. What is the biggest sum of those removed numbers? Lilu can always find the answer, can you?
Input
The first line is a integer T indicating the number of test cases.T cases fllows. Each case includs two integers n, m(m ≤ 50,n ≤ 50) and n * m non-negative integers, which is not more than 40000.
Output
For each test case, output the biggest sum.
Sample Input
1
3 2
180 25
210 45
220 100
Sample Output
445
题意:
给出一张n*m的网格图,每个格子有一个非负权值c[i][j],选取一些两两不相邻的格子,使得权值最大...
分析:
最大权值独立集问题,网格图,所以可以黑白染色,S向黑色点连一条容量为格子权值的边,白色点向T连一条容量为格子权值的边,黑色点向相邻的白色点连一条容量为+∞的边,然后求出的最小割就是最小点权覆盖,用总权值减去最小割就是答案了...
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
#define inf 0x3f3f3f3f
using namespace std; const int maxn=++,maxm=maxn*+; int cas,n,m,mv[][]={,,,-,,,-,},ans;
int S,T,cnt,hd[maxn],fl[maxm],to[maxm],nxt[maxm],pos[maxn]; inline void add(int s,int x,int y){
fl[cnt]=s;to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++;
fl[cnt]=;to[cnt]=x;nxt[cnt]=hd[y];hd[y]=cnt++;
} inline bool bfs(void){
memset(pos,-,sizeof(pos));
int q[maxn],head=,tail=;
q[]=S,pos[S]=;
while(head<=tail){
int top=q[head++];
for(int i=hd[top];i!=-;i=nxt[i])
if(pos[to[i]]==-&&fl[i])
pos[to[i]]=pos[top]+,q[++tail]=to[i];
}
return pos[T]!=-;
} inline int find(int v,int f){
if(v==T)
return f;
int res=,t;
for(int i=hd[v];i!=-&&f>res;i=nxt[i])
if(pos[to[i]]==pos[v]+&&fl[i])
t=find(to[i],min(f-res,fl[i])),res+=t,fl[i]-=t,fl[i^]+=t;
if(!res)
pos[v]=-;
return res;
} inline int dinic(void){
int res=,t;
while(bfs())
while(t=find(S,inf))
res+=t;
return res;
} signed main(void){
scanf("%d",&cas);
while(cas--){
memset(hd,-,sizeof(hd));
cnt=ans=;scanf("%d%d",&n,&m);S=,T=n*m+;
for(int i=;i<=n;i++)
for(int j=,x;j<=m;j++){
scanf("%d",&x);ans+=x;
if((i+j)&){
add(x,S,(i-)*m+j);
for(int k=;k<;k++){
int xx=i+mv[k][],yy=j+mv[k][];
if(xx>&&xx<=n&&yy>&&yy<=m)
add(inf,(i-)*m+j,(xx-)*m+yy);
}
}
else
add(x,(i-)*m+j,T);
}
ans=ans-dinic();printf("%d\n",ans);
}
return ;
}
by NeighThorn
HOJ 2713 Matrix1的更多相关文章
- [ HOJ 2713]Matrix1[网络流] 最大点权独立集问题
题目大意: 一个 N*M 的网格,每个单元都有一块价值 Cij 的宝石.问最多能取多少价值的宝石且任意两块宝石不相邻.(1 <= N, M <= 50, 0 <= Cij <= ...
- HOJ题目分类
各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...
- hoj 2662 经典状压dp // MyFirst 状压dp
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...
- HOJ 1797 Red and Black
传送门 http://acm.hit.edu.cn/hoj/problem/view?id=1797 总体的思路是遍历可以到达的' . ',将其对应的vis数组化为1,然后统计所有为1的vis项; ...
- HOJ 1001: A+B; 1002: A+B+C
两道水题,用来熟悉 HOJ 的提交系统. 1001:输入两个整数 A, B (0 <= A,B <= 10),输出 A+B. #include <iostream> using ...
- 【hoj】2651 pie 二分查找
二分查找是一个非常主要的算法,针对的是有序的数列,通过中间值的大小来推断接下来查找的是左半段还是右半段,直到中间值的大小等于要找到的数时或者中间值满足一定的条件就返回,所以当有些问题要求在一定范围内找 ...
- 【BZOJ 2713】[Violet 2]愚蠢的副官&&【BZOJ1183】[Croatian2008]Umnozak——【数位DP】
题目链接: 2713传送门 1183传送! 题解: 由于看不懂英文题解(十个单词十一个不认识……),所以只能自己想QAQ. 其实乱搞就好= =. 首先我们发现,各位数字乘积要在1e9以下才可能有用,这 ...
- HOJ 2148&POJ 2680(DP递推,加大数运算)
Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4561 Accepted: 17 ...
- POJ 1964&HDU 1505&HOJ 1644 City Game(最大0,1子矩阵和总结)
最大01子矩阵和,就是一个矩阵的元素不是0就是1,然后求最大的子矩阵,子矩阵里的元素都是相同的. 这个题目,三个oj有不同的要求,hoj的要求是5s,poj是3秒,hdu是1秒.不同的要求就对应不同的 ...
随机推荐
- linux 修改home 目录
第一种方法:vi /etc/passwd 找到要修改的用户那几行,修改掉即可.此法很暴力,建议慎用. /etc/passwd文件格式 登录名:加密口令:数字用户ID:数字组ID:注释字段:起 ...
- 操作系统开发系列—12.c.从Loader加载ELF内核,顺便解释下函数调用过程 ●
实际上,我们要做的工作是根据内核的Program header table的信息进行类似下面这个C语言语句的内存复制: memcpy(p_vaddr, BaseOfLoaderPhyAddr+p_of ...
- Xcode8如何去除控制台多余的打印信息
Xcode8如何去除控制台多余的打印信息 最近刚使用了Xcode8.遇到了一些问题,总结如下.希望对大家有所帮助. 一.如何去除控制台多余的打印信息. 方法:点击Product----Scheme-- ...
- UIApplication是什么
1.UIApplication对象是应用程序的象征 2.每一个应用都有自己的UIApplication对象,而且是单例的(只有一个) 3.通过[UIApplication sharedAppl ...
- C语言中的数组的一些笔记
C语言是面向过程的语言. 计算数组长度: Int count =sizeof(ages)/sizeof(int); C语言里面输出字符串,必须以'\0'结束,如果没有则一直执行下去. Char nam ...
- iOS-UITableView的优化(纯手打原创)
TableView的优化 一:什么是TableView的优化以及为什么要优化 1)CPU(中央处理器)和GPU(图形处理器) CPU主要从事逻辑计算的一些工作 GPU主要从事图形处理方面的工作 2 ...
- iOS 从Xcode看应用支持横竖屏
要看一个应用是否支持横竖屏,要看Xcode里面的info.plist文件设置才清楚,每一个新建工程都会包含三个支持方式,即Supported interface orientations里面的就是 P ...
- django 操作 下载 excel xls xlsx csv
网站开发离不开数据的导入导出,本文将介绍一下django如何操作excel 先安装 django-excel pip install django-excel 配置一下url url(r'^downl ...
- nodejs学习笔记(1)--express安装问题:express不是内部也或者外部的命令解决方案
"Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具.使用 Express 可以快速地搭建一个完 ...
- Java中的内部接口
什么是内部接口 内部接口也称为嵌套接口,即在一个接口内部定义另一个接口.举个例子,Entry接口定义在Map接口里面,如下代码: public interface Map { interface En ...