hdu 1569 最大权独立集
/*最大点权独立集=sum-最小点权覆盖*/
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define inf 0x3fffffff
#define ll __int64
#define N 3000
struct node
{
ll u,v,w,next;
}bian[N*N*2];
ll ma[N][N],id[N][N],head[N],yong,s,t,dis[N];;
void addedge(ll u,ll v,ll w)
{
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
void add(ll u,ll v,ll w)
{
addedge(u,v,w);
addedge(v,u,0);
}
void init()
{
yong=0;
memset(head,-1,sizeof(head));
memset(dis,-1,sizeof(dis));
}
void bfs()
{
ll u,v,i;
queue<ll>q;
q.push(t);
dis[t]=0;
while(!q.empty())
{
u=q.front();
q.pop();
for(i=head[u]; i!=-1; i=bian[i].next)
{
v=bian[i].v;
if(dis[v]==-1)
{
dis[v]=dis[u]+1;
q.push(v);
}
}
}
return ;
}
ll ISAP()
{
ll sum=0;
bfs();
ll gap[N],cur[N],stac[N],top,i;
memset(gap,0,sizeof(gap));
for(i=s; i<=t; i++)
{
gap[dis[i]]++;
cur[i]=head[i];
}
ll k=s;
top=0;
while(dis[s]<t+1)
{
if(k==t)
{
ll minn=inf,index;
for(i=0; i<top; i++)
{
ll e=stac[i];
if(minn>bian[e].w)
{
minn=bian[e].w;
index=i;
}
}
for(i=0; i<top; i++)
{
ll e=stac[i];
bian[e].w-=minn;
bian[e^1].w+=minn;
}
sum+=minn;
top=index;
k=bian[stac[top]].u;
}
for(i=cur[k]; i!=-1; i=bian[i].next)
{
ll v=bian[i].v;
if(bian[i].w&&dis[k]==dis[v]+1)
{
cur[k]=i;
k=v;
stac[top++]=i;
break;
}
}
if(i==-1)
{
ll m=t+1;
for(i=head[k]; i!=-1; i=bian[i].next)
if(m>dis[bian[i].v]&&bian[i].w)
{
m=dis[bian[i].v];
cur[k]=i;
}
if(--gap[dis[k]]==0)break;
gap[dis[k]=m+1]++;
if(k!=s)
k=bian[stac[--top]].u;
}
}
return sum;
}
int main()
{
ll n,m,i,j,cnt;
ll sum;
while(scanf("%I64d%I64d",&n,&m)!=EOF)
{
init();
cnt=1;
sum=0;s=0;t=n*m+1;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
scanf("%I64d",&ma[i][j]);
id[i][j]=cnt++;
sum+=ma[i][j];
}
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
if((i+j)&1)
{
add(s,id[i][j],ma[i][j]);
if(i<=n-1)
add(id[i][j],id[i+1][j],inf);
if(j<=m-1)
add(id[i][j],id[i][j+1],inf);
if(i>=2)
add(id[i][j],id[i-1][j],inf);
if(j>=2)
add(id[i][j],id[i][j-1],inf);
}
else
add(id[i][j],t,ma[i][j]);
}
printf("%I64d\n",sum-ISAP());
}
return 0;
}
hdu 1569 最大权独立集的更多相关文章
- hdu 1565&&hdu 1569 (最大点权独立集)
题目意思很明确就是选一些没有相连的数字,使和最大,建成二分图后求最大点权独立集,, #include<stdio.h> #include<string.h> const int ...
- HDU 1569 方格取数(2)(最大流最小割の最大权独立集)
Description 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大. ...
- hdu 1565&hdu 1569(网络流--最小点权值覆盖)
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- CF1404E Bricks (最大权独立集)
考虑把答案进行转化,通过分矩形条,我们能去掉一些夹在#之间的边 那么答案= #个数 - 能去掉的边个数 但去掉是有限制的,同一个#格子的横边和竖边不能同时去掉 把边转化成点,限制变成边. 横竖边的点 ...
- HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]
嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...
- HDU 1569 方格取数(2)
方格取数(2) Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 15 ...
- Assignment (HDU 2853 最大权匹配KM)
Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 3061 hdu 3996 最大权闭合图 最后一斩
hdu 3061 Battle :一看就是明显的最大权闭合图了,水提......SB题也不说边数多少....因为开始时候数组开小了,WA....后来一气之下,开到100W,A了.. hdu3996. ...
- HDU 1565 最大点权独立集
首先要明白图论的几个定义: 点覆盖.最小点覆盖: 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是“点” 覆盖了所有“边”.. 最小点覆盖(minimum vertex covering ...
随机推荐
- CF85 E Guard Towers——二分图
题目:http://codeforces.com/contest/85/problem/E 给定一些点的坐标,求把它们分成两组,组内最大距离的最小值: 二分答案,判断就是看距离大于 mid 的点能否组 ...
- oracle 分页方法
我分享两种: 1.用rownum select * from (select p.* , rownum rn from t_premium p where rn<= page * 10) a ...
- git期末总结(转载)
转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137586810169 ...
- nodejs在windows下的安装
Windowv 上安装Node.js Windows 安装包(.msi) : 32 位安装包下载地址 : http://nodejs.org/dist/v0.10.26/node-v0.10.26-x ...
- robotframework - 介绍&应用
一.参考简书链接 :https://www.jianshu.com/p/c3a9d20db4e5 二.介绍 Robot Framework是一个基于Python的,可扩展的关键字驱动的测试自动化框架, ...
- maven+ssm+oracle实现简单的增删改查
首先看一下项目结构 第一步先导入jar包 pom.xml <properties> <spring.version>4.3.18.RELEASE</spring.vers ...
- vscode常用的快捷键
对于编程人员来说,记住一些常用的快捷键能够提高工作效率:我认为,对于编程人员来说,掌握一些常用的快捷键是非常有必要的! Ctrl + Shift + N 打开新的编辑器窗口 Ctrl + Shift ...
- 修路方案 Kruskal 之 次小生成树
次小生成树 : Kruskal 是先求出来 最小生成树 , 并且记录下来所用到的的边 , 然后再求每次都 去掉最小生成树中的一个边 , 这样求最小生成树 , 然后看能不能得到 和原来最小生成树一样的 ...
- Objective-C——Runtime理解
动态语言 OC是一门不折不扣的动态语言,所以它的很多机制都是动态运行时决定的.这点和C语言不一样,C语言是静态绑定,也就是编译后所有的一切都已经决定了.这一点和C语言的函数指针有些类似,很多时候函数指 ...
- Maven 学习(1)
Maven是什么,以及为什么要使用Maven?Maven这个词可以翻译为“知识的积累”,也可以翻译为“专 家”或“内行”.(构建 = 编写源代码+编译源代码+单元测试+生成文档+打包War+部署)Ma ...