对于网络流有一个定理:

最小点权覆盖集=最大网络流;

最大点权独立集=总权值-最小点权覆盖集;

网络流解法代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define N 1010
#define M 50010
#define inf 1<<30
using namespace std;
struct Edge{
int to,val,next;
}edge[M];
int index[N],d[N],gap[N],e;
void addedge(int from,int to,int val)
{
edge[e].to=to;
edge[e].val=val;
edge[e].next=index[from];
index[from]=e++;
edge[e].to=from;
edge[e].val=;
edge[e].next=index[to];
index[to]=e++;
}
int source,des,n,m;
//n is the number of point
int dfs(int pos,int flow)
{
if(pos==des)
return flow;
int i,j,v,val,lv,mind,c;
mind=n-;//初始最小标号为n-1
lv=flow;
for(i=index[pos];i!=-;i=edge[i].next)
{
v=edge[i].to;
val=edge[i].val;
if(val)
{
if(d[v]+==d[pos])
{
c=min(lv,val);//对于该点的最小可行流
c=dfs(v,c);
edge[i].val-=c;//更新剩余图
edge[i^].val+=c;
lv-=c;
if(d[source]>=n)return flow-lv;
if(lv==) break;
}
if(d[v]<mind)mind=d[v];//找出与pos相连的点的最小标号
}
}
if(lv==flow)//没有找到增广路劲,进行标号更新
{
--gap[d[pos]];
if(!gap[d[pos]])
d[source]=n;
d[pos]=mind+;
++gap[d[pos]];
}
return flow-lv;
}
int sap(int st,int de)
{
source=st;
des=de;
memset(d,,sizeof(d));
memset(gap,,sizeof(gap));
gap[]=n;//初始标号为0的有n个.
int ans=;
while(d[st]<n)
{
ans+=dfs(st,inf);
//cout<<d[st]<<endl;
}
return ans;
}
void init()
{
e=;
memset(index,-,sizeof(index));
}
int pos(int a,int b)
{
return (a-)*m+b;
}
int main()
{
int t,i,j;
while(scanf("%d",&m)!=EOF)
{ init();
int w;
int sum=;
for(i=;i<=m;i++)
for(j=;j<=m;j++)
{
scanf("%d",&w);
sum+=w;
if((i+j)%==)
{
addedge(,pos(i,j),w);
if(i<m)
addedge(pos(i,j),pos(i+,j),inf);
if(j<m)
addedge(pos(i,j),pos(i,j+),inf);
if(i>)
addedge(pos(i,j),pos(i-,j),inf);
if(j>)
addedge(pos(i,j),pos(i,j-),inf);
}
else
addedge(pos(i,j),m*m+,w);
}
n=m*m+;
printf("%d\n",sum-sap(,n-));
}
return ;
}

状态压缩解法:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int s[<<];
int map[][];
int dp[][<<];
int main()
{
int n,i,j,t,k,num=;;
n=<<;
for(i=;i<=n;i++)//记录可行状态
if((i&(i<<))==)
s[num++]=i;
while(scanf("%d",&n)!=EOF)
{
for(i=;i<n;i++)
for(j=;j<n;j++)
scanf("%d",&map[i][j]);
int p=;
memset(dp,,sizeof(dp));
for(i=;i<n;i++)//枚举每一行
{
p^=;//进行滚动数组
for(j=;j<num;j++)//枚举每行的所有状态
{
if(s[j]>(<<n))
break;
int sum=;
for(k=;k<n;k++) if(s[j]&(<<k)) sum+=map[i][k];//记录该状态值
for(k=;k<num;k++)//枚举已经得到的状态转移到该状态能到的最大值
{
if(s[k]>(<<n))
break;
if(!(s[k]&s[j]))
dp[p][s[j]]=max(dp[p][s[j]],dp[-p][s[k]]+sum);
}
}
}
int ans=;
for(i=;i<num&&s[i]<=(<<n);i++)//寻找答案
ans=max(ans,dp[p][s[i]]);
printf("%d\n",ans);
}
return ;
}

hdu1565 网络流或状态压缩DP的更多相关文章

  1. HDU1565 方格取数(1)(状态压缩dp)

    题目链接. 分析: 说这题是状态压缩dp,其实不是,怎么说呢,题目数据太水了,所以就过了.手动输入n=20的情况,超时.正解是网络流,不太会. A这题时有个细节错了,是dp[i][j]还是dp[i][ ...

  2. HDU1565+状态压缩dp

    简单的压缩状态 dp /* 状态压缩dp 同hdu2167 利用滚动数组!! */ #include<stdio.h> #include<string.h> #include& ...

  3. 状态压缩dp poj 3254 hdu5045

    近来感觉状态压缩dp的强大性(灵活利用了二进制运算非常关键). . . 于是做了俩提来看看..毕竟队友是专业的dp.我仅仅是管中窥豹下而已.. 日后有机会再与之玩耍玩耍...ps:假设上天再给我一次机 ...

  4. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  5. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  6. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  7. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  8. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  9. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

随机推荐

  1. AutoCAD.NET二次开发:创建自定义菜单(COM)

    当我们要在CAD中创建自定菜单时,可以引用COM组件来实现. 下面是实现方式: 1.新建类库项目,并引用CAD目录(我这里用的是CAD2008)下的acdbmgd.dll.acmgd.dll,并将引用 ...

  2. HDU 2275 multiset

    题意:n个操作 Push 入容器 Pop弹出一个 满足<=该数的最大的数(若没有输出No Element!) 开始用set打了一遍wrong了,这里入容器的数是有重复的,所以用multiset ...

  3. Codeforces Beta Round #7 C. Line (扩展欧几里德)

    题目链接:http://codeforces.com/problemset/problem/7/C 给你一个直线方程,有整数解输出答案,否则输出-1. 扩欧模版题.这里有讲解:http://www.c ...

  4. UVALIVE 4970 最小权匹配

    首先贴一下这道题的BNU地址,UVA地址自己找吧. http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=11852 题意:这道题的意思就是,给你N个棋子的 ...

  5. Javascript高级篇-JS闭包

    Javascript闭包 1.变量的作用域 1.1局部变量 1.2全局变量(声明在外边或不用var来声明的变量) 2.外部读取方法内部的局部(私有)变量 function a(){ var b = & ...

  6. [置顶] 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

  7. Python中的基本语句

    本文简单的介绍下Python的几个基本语句. print语句 print可同时打印多个表达式,只要将他们用逗号隔开. >>> name='Gumy' >>> gre ...

  8. cocos2d-x Mask的实现及优化

    转自:http://blog.ch-wind.com/cocos2d-x%E4%B8%ADmask%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8F%8A%E4%BC%98%E5%8C ...

  9. cocos2d 制作动态光晕效果基础 —— blendFunc

    转自:http://blog.csdn.net/yang3wei/article/details/7795764 最近的项目要求动态光晕的效果. 何谓动态光晕?之前不知道别人怎么称呼这个效果, 不过在 ...

  10. vector 与map的下标操作

    1.vector的下标操作不会添加元素,只能针对已经存在的元素操作. 2.map的下标操作具有副作用,key不存在,会在map中添加一个具有该key的新元素,新元素的value使用默认构造方法. 3. ...