hdu1569
题解:
网络流
最大权独立集=总和-最大流
然后构图
代码:
- #include<cstdio>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int N=;
- int num,k,dis[N],t,ans,q[N],fi[N],ne[N],ans1,zz[N],sl[N],n,m,a[][];
- void jb(int x,int y,int z)
- {
- ne[num]=fi[x];
- fi[x]=num;
- zz[num]=y;
- sl[num++]=z;
- swap(x,y);
- z=;
- ne[num]=fi[x];
- fi[x]=num;
- zz[num]=y;
- sl[num++]=z;
- }
- int bfs()
- {
- memset(dis,0xff,sizeof dis);
- dis[]=;
- int l=,r=;
- q[]=;
- while (l<r)
- {
- int j=q[++l];
- for (int i=fi[j];i!=-;i=ne[i])
- if (dis[zz[i]]<&&sl[i]>)
- {
- dis[zz[i]]=dis[j]+;
- q[++r]=zz[i];
- }
- }
- if (dis[n]>)return ;
- return ;
- }
- int find(int x,int low)
- {
- int b=;
- if (x==n)return low;
- for (int i=fi[x];i!=-;i=ne[i])
- if (sl[i]>&&dis[zz[i]]==dis[x]+&&(b=find(zz[i],min(low,sl[i]))))
- {
- sl[i]-=b;
- sl[i^]+=b;
- return b;
- }
- return ;
- }
- void doit()
- {
- memset(fi,-,sizeof fi);
- memset(a,,sizeof a);
- memset(sl,,sizeof sl);
- ans1=ans=;num=;
- for (int i=;i<=n;i++)
- for (int j=;j<=m;j++)
- {
- scanf("%d",&a[i][j]);
- ans1+=a[i][j];
- if ((i+j)&)jb(,(i-)*m+j+,a[i][j]);
- else jb((i-)*m+j+,n*m+,a[i][j]);
- }
- for (int i=;i<=n;i++)
- for (int j=;j<=m;j++)
- if ((i+j)&)
- {
- if (i!=)jb((i-)*m+j+,(i-)*m+j+,1e9);
- if (i!=n)jb((i-)*m+j+,i*m+j+,1e9);
- if (j!=)jb((i-)*m+j+,(i-)*m+j,1e9);
- if (j!=m)jb((i-)*m+j+,(i-)*m+j+,1e9);
- }
- int t;ans=;
- n=n*m+;
- while (bfs())
- while (t=find(,1e9))ans+=t;
- printf("%d\n",ans1-ans);
- }
- int main()
- {
- while (~scanf("%d%d",&n,&m))doit();
- }
hdu1569的更多相关文章
- hdu1565+hdu1569(最大点权独立集)
传送门:hdu1565 方格取数(1) 传送门:hdu1569 方格取数(2) 定理:1. 最小点权覆盖集=最小割=最大流2. 最大点权独立集=总权-最小点权覆盖集 步骤: 1. 先染色,取一个点染白 ...
- hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)
/** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...
- HDU1569 方格取数(2) —— 二分图点带权最大独立集、最小割最大流
题目链接:https://vjudge.net/problem/HDU-1569 方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- HDU1569+最大点权集
/* 最大点权独立集=总权值-最小点权覆盖集 最大点权独立集=最大流 最小点权覆盖集=最小割 题意: 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格 ...
- hdu1569 莫比乌斯反演
hdu 1695 莫比乌斯反演 给出a,b,c,d,k, 求满足a <= x <= b && c <= y <= d && gcd(x,y)=k ...
- HDU1569 最大流(最大点权独立集)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- hdu1569 方格取数 求最大点权独立集
题意:一个方格n*m,取出一些点,要求两两不相邻,求最大和.思路:建图,相邻的点有一条边,则建立了一个二分图,求最大点权独立集(所取点两两无公共边,权值和最大),问题转化为求总权和-最小点权覆盖集(点 ...
- HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]
题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...
- HDU1565 方格取数(1) —— 状压DP or 插头DP(轮廓线更新) or 二分图点带权最大独立集(最小割最大流)
题目链接:https://vjudge.net/problem/HDU-1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory L ...
随机推荐
- Java 为什么要使用反射(通俗易懂的举例)
Java反射最大的好处就是能在运行期间,获得某个类的结构.成员变量,用来实例化. 下列是具体使用场景:假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完 ...
- java泛型的实现原理
java泛型的实现原理是类型擦除.Java的泛型是伪泛型.在编译期间,所有的泛型信息都会被擦除掉. Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节码中是不包含泛型中的类型 ...
- ultraedit 查看文件
转自:https://wenda.so.com/q/1481655902726192 1 UltraEdit在打开文件的时候,会对文件类型进行检查.如果是二进制文件,会自动转为16进制显示模式.如下图 ...
- Java读者写者问题
实验存档. 允许好几个人同时读,但是不允许在有人读的时候写,以及同一时间只能有一个人在写. 读者.java: package operating.entity.readerwriter; import ...
- vsftpd搭建ftp服务,并实现虚拟用户访问
安装vsftpd服务: yum install vsftpd -y [root@wadeson ~]# rpm -ql vsftpd /etc/logrotate.d/vsftpd /etc/pam. ...
- Activiti工作流与spring集成
一.前言 前面Activiti工作流的学习,说明了Activiti的基本应用,在我们开发中可以根据实际的业务参考Activiti的API去更好的理解以及巩固.我们实际的开发中我们基本上都使用sprin ...
- 【前端】display: box布局教程 [转]
css display:box 新属性 一.display:box; 在元素上设置该属性,可使其子代排列在同一水平上,类似display:inline-block;. 二.可在其子代设置如下属性 ...
- Springboot-mongodb MongoRepository接口 save方法 详解
问题: 我们都知道 mongodb 有两种添加数据的方式 一种 就是 save 方法 另外一种 insert 方法 这里两个方法 唯一的区别就是 insert:当主键"_id&qu ...
- java高级特性(4)--枚举
枚举(enum),是指一个经过排序的.被打包成一个单一实体的项列表.一个枚举的实例可以使用枚举项列表中任意单一项的值.枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色.方式.类别.状态等等数目 ...
- python一个元素全为数的列表做差分
woc = [7, 5, 7, 3, 5, 1, 2] diff = [ wo[i]-wo[i+1] for i in range(len(wo)-1) ]