对于网络流有一个定理:

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

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

网络流解法代码如下:

#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. IMAQ Flatten Image to String VI的参数设置对比

    无压缩 jpeg压缩 无损二元包装 仅JPEG压缩时有效 平化类型(指定字符串中存储什么类型的数据)   None JPEG PACKED BINARY Quality Image Image and ...

  2. 数据库防sql注入

  3. CodeForces 706B Interesting drink (二分查找)

    题意:给定 n 个数,然后有 m 个询问,每个询问一个数,问你小于等于这个数的数有多少个. 析:其实很简单么,先排序,然后十分查找,so easy. 代码如下: #pragma comment(lin ...

  4. matlab中读取txt数据文件(转)

    根据txt文档不同种类介绍不同的读取数据方法 一.纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如test.txt文件,内容为“17.901 -1.111 ...

  5. Unity3D之UGUI学习笔记(二):Rect Transform与Anchor

    Rect Transform 我们都知道,Unity3D中所有的GameObject都必须要携带一个Transform组件,且该组件无法移除,那么作为UI显示的GameObject则不是携带Trans ...

  6. ssl配置

    Apache SSL配置 作者: JeremyWei | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://weizhifeng.net/apache-ssl.h ...

  7. Telnet端口测试

    $IP ="220.181.111.142"$Port ="801" Function Port-Test ($IP,$Port){ $Timeout = 10 ...

  8. DynamoDB Local for Desktop Development

    Would you like to be able to write and test code that uses the Amazon DynamoDB API even if you have ...

  9. CSAPP缓冲区溢出攻击实验(上)

    CSAPP缓冲区溢出攻击实验(上) 下载实验工具.最新的讲义在这. 网上能找到的实验材料有些旧了,有的地方跟最新的handout对不上.只是没有关系,大体上仅仅是程序名(sendstring)或者參数 ...

  10. LVS三种模式配置及优点缺点比较 转

    LVS三种模式配置及优点缺点比较   作者:gzh0222,发布于2012-11-12,来源:CSDN   目录: LVS三种模式配置 LVS 三种工作模式的优缺点比较 LVS三种模式配置 LVS三种 ...