HDU 1565 最大点权独立集
首先要明白图论的几个定义:
点覆盖、最小点覆盖:
点覆盖集即一个点集,使得所有边至少有一个端点在集合里。或者说是“点” 覆盖了所有“边”。。
最小点覆盖(minimum vertex covering):
点最少的点覆盖。
点覆盖数(vertex covering number):
最小点覆盖的点数。
独立集:
独立集即一个点集,集合中任两个结点不相邻,则称V为独立集。或者说是导出的子图是零图(没有边)的点集。
最大独立集(maximum independent set):
点最多的独立集。
独立数(independent number):
最大独立集的点。
若把上面最小点覆盖和最大独立集中的端点数改成点的权值,分别就是最小点权覆盖和最大点权独立集的定义。
然后通过推导,我们可以证明一下公式:(具体证明请看胡伯涛《最小割模型在信息学竞赛中的应用》,这里只考虑应用)
最大点权独立集=总权值-最小点权覆盖集。
最小点权覆盖集=图的最小割值=最大流。
这道题很明显就是求最大点权独立集,所以直接套用公式即可。
建图:如果S与(i+j)%2==0的点相连,(i+j)%2==1的点与T相连,容量为该点的权值。(i+j)%==0与(i+j)%2==1的点相连,容量为无限大。
代码:
- #include<stdio.h>
- #include<string.h>
- #include<iostream>
- using namespace std;
- const int INF=0x3f3f3f3f;
- const int N=;
- const int M=N*N;
- int h[N],gap[N],head[N];
- int cnt,n,m,s,t;
- int a[N][N];
- struct node
- {
- int v,c,next;
- }e[M];
- void init()
- {
- memset(head,-,sizeof(head));
- cnt=;
- }
- void add(int u,int v,int w)
- {
- e[cnt].v=v,e[cnt].c=w;
- e[cnt].next=head[u];head[u]=cnt++;
- e[cnt].v=u,e[cnt].c=;
- e[cnt].next=head[v];head[v]=cnt++;
- }
- int dfs(int u,int flow)
- {
- if(u==t) return flow;
- int c=flow,a,i,v,minh=t;
- for(i=head[u];i!=-;i=e[i].next)
- {
- if(e[i].c)
- {
- v=e[i].v;
- if(h[v]==h[u]-)
- {
- a=min(c,e[i].c);
- a=dfs(v,a);
- e[i].c-=a;
- e[i^].c+=a;
- c-=a;
- if(h[s]>t) return flow-c;
- if(!c) break;
- }
- minh=min(minh,h[v]);
- }
- }
- if(c==flow)
- {
- if(--gap[h[u]]==) h[s]=t+;
- h[u]=minh+;
- ++gap[h[u]];
- }
- return flow-c;
- }
- int isap()
- {
- memset(gap,,sizeof(gap));
- memset(h,,sizeof(h));
- int ans=;gap[]=t+;
- while(h[s]<=t)
- ans+=dfs(s,INF);
- return ans;
- }
- int main()
- {
- int i,j,sum;
- while(scanf("%d",&n)!=EOF)
- {
- sum=;init();s=,t=n*n+;
- for(i=;i<=n;i++)
- {
- for(j=;j<=n;j++)
- {
- scanf("%d",&a[i][j]);
- sum+=a[i][j];
- if((i+j)%==)
- {
- add(s,(i-)*n+j,a[i][j]);
- if(i>) add((i-)*n+j,(i-)*n+j,INF);
- if(j>) add((i-)*n+j,(i-)*n+j-,INF);
- if(i<n) add((i-)*n+j,(i)*n+j,INF);
- if(j<n) add((i-)*n+j,(i-)*n+j+,INF);
- }
- else
- add((i-)*n+j,t,a[i][j]);
- }
- }
- printf("%d\n",sum-isap());
- }
- return ;
- }
HDU 1565 最大点权独立集的更多相关文章
- hdu 1565&&hdu 1569 (最大点权独立集)
题目意思很明确就是选一些没有相连的数字,使和最大,建成二分图后求最大点权独立集,, #include<stdio.h> #include<string.h> const int ...
- hdu 4859 最大点权独立集的变形(方格取数的变形)
/*刚开始不会写,最大点权独立集神马都不知道,在潘神的指导下终于做出来,灰常感谢ps: 和方格取数差不多奇偶建图,对于D必割点权为0,对于.必然不割点权为inf.然后和方格取数差不多的建图 .--.| ...
- hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)
转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...
- hdu 3657最大点权独立集变形(方格取数变形)
/* 分奇偶为二部图,s与奇建图,t与偶建图,权值为当前数的值,如果遇到必取的权值置为inf. 奇偶建边为相邻的权值为2*(x&y):所有数的值-最小点全覆盖. 置为inf意为不能割掉.奇偶边 ...
- HDU 1565 方格取数(1)(最大点权独立集)
http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格 ...
- HDU 1565 1569 方格取数(最大点权独立集)
HDU 1565 1569 方格取数(最大点权独立集) 题目链接 题意:中文题 思路:最大点权独立集 = 总权值 - 最小割 = 总权值 - 最大流 那么原图周围不能连边,那么就能够分成黑白棋盘.源点 ...
- hdu - 1565 方格取数(1) && 1569 方格取数(2) (最大点权独立集)
http://acm.hdu.edu.cn/showproblem.php?pid=1565 两道题只是数据范围不同,都是求的最大点权独立集. 我们可以把下标之和为奇数的分成一个集合,把下标之和为偶数 ...
- HDU 1565:方格取数(1)(最大点权独立集)***
http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意:中文. 思路:一个棋盘,要使得相邻的点不能同时选,问最大和是多少,这个问题就是最大点权独立集. 可以 ...
- HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]
嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...
随机推荐
- CentOS常用指令
创建文件: 如touch a.txt 创建文件夹: mkdir -p 文件夹名,当文件夹不存在时候,创建这个文件夹 文件重命名: 把文件text.php得命名为index.php,可以是rename ...
- 数据库设计==>>MySchool
1.数据库设计的步骤 第一步:需求分析(收集信息) 第二步:绘制 E-R 图 (标示实体 ,找到实体的属性 第三步:将 E-R 图转换成数据库模型图 第四步:将数据库模型图转换成数据表 2.如何绘制 ...
- 硅谷新闻8--TabLayout替换ViewPagerIndicator
1.关联库 compile 'com.android.support:design:23.3.0' 2.布局写上TabLayout <android.support.design.widget. ...
- Sigleton 单例模式 的简单应用
需求:一个简单的后台java程序,收集信息,并将信息发送到远端服务器. 实现:实现一个后台线程,实时处理发送过来的信息,并将信息发送到服务器. 技术要点: 1.单例模式 2.队列 并没有实现全部代码, ...
- jQuery waterbubble 水球图
在线实例 默认效果 显示文本 水球半径 文本颜色 边框宽度 设置字体 数据多少 是否显示波纹 水球颜色 是否显示动画 使用方法 <div class="wrap"> & ...
- CSS的一些小事
1.什么时候能将零散的图片整合成一张大图,达到减少请求数的作用? 答:整合进大图的图片是被设置no-repeat用的,如果是repeat-x.repeat-y就不可以. 2.E + F 选择紧贴在E元 ...
- .net学习总结
.NET 学前入门 了解.Net能做什么 了解.NET,C#语言及其特点(分清.NET和C#的关系),对.Net学习有系统全面的认识. C#基础 变量,赋值运算符.数据类型转换等. 选择结构控制(if ...
- CSS3选择器(一)
E[att^='val'] 选择属性值以val开头的任何字符 E[att$='val'] 选择属性值以val结尾的任何字符 E[att*='val'] 选择属性值包含val的任何字符 :root HT ...
- javascript中apply()和call()方法的区别
一.方法的定义 call方法: 语法:call(thisObj,Object)定义:调用一个对象的一个方法,以另一个对象替换当前对象.说明:call 方法可以用来代替另一个对象调用一个方法.call ...
- Swift学习--常量.变量.数据类型的使用(一)
一.Swift中的常量和变量 /* Swift 中定义常量和变量用let/var let 代表定义一个常量 var 代表定义一个变量 Swift 中代表定义常量和变量不需要写数据类型,编译器辉根据我们 ...