hdu1565 网络流或状态压缩DP
对于网络流有一个定理:
最小点权覆盖集=最大网络流;
最大点权独立集=总权值-最小点权覆盖集;
网络流解法代码如下:
#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的更多相关文章
- HDU1565 方格取数(1)(状态压缩dp)
题目链接. 分析: 说这题是状态压缩dp,其实不是,怎么说呢,题目数据太水了,所以就过了.手动输入n=20的情况,超时.正解是网络流,不太会. A这题时有个细节错了,是dp[i][j]还是dp[i][ ...
- HDU1565+状态压缩dp
简单的压缩状态 dp /* 状态压缩dp 同hdu2167 利用滚动数组!! */ #include<stdio.h> #include<string.h> #include& ...
- 状态压缩dp poj 3254 hdu5045
近来感觉状态压缩dp的强大性(灵活利用了二进制运算非常关键). . . 于是做了俩提来看看..毕竟队友是专业的dp.我仅仅是管中窥豹下而已.. 日后有机会再与之玩耍玩耍...ps:假设上天再给我一次机 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
随机推荐
- JSF 2 listbox example
In JSF, <h:selectOneListbox /> tag is used to render a single select listbox – HTML select ele ...
- Cannot retrieve metalink for repository: epel. Please verify its path and try again
今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Please verify its path ...
- 三星手机 Samsung Galaxy S3 无法复制粘贴的不完美解决方法
问题简单描述 从上周开始我的Samsung Galaxy S3手机就无法实现复制粘贴功能了,每次复制时都提示复制到了剪贴板,但是粘贴时就会发现根本粘贴不了,无法打开剪贴板.真的是莫明其妙啊,我的手机没 ...
- JPA project Change Event Handler问题解决[转]
转至:http://my.oschina.net/cimu/blog/278724 这是Eclipse中的一个GUG: Bug 386171 - JPA Java Change Event Handl ...
- C#操作Excel的OLEDB方式与COM方式比较
2013-03-15 13:42:54 作者:有理想的码农 在对Excel进行读写操作时,使用微软自身提供的解决方案,有两种(第三方方式除外),分别是OLEDB方式和调用COM组件的方式 ...
- .NET通用权限系统快速开发框架
DEMO下载地址: http://download.csdn.net/detail/shecixiong/5372895 一.开发技术:B/S(.NET C# ) 1.Windows XP以上 (支援 ...
- VMM服务模板(虚机、APP)部署排错
I won't focus this blog on how to create a service template but more on how you can track the change ...
- 中国软件开发project师之痛
在最近的一次会议上,有高层谈到之前在中国觉得自己做得非常牛,但与美国同行接触后却发现与人家存在非常大的差距,这一点我在外企工作时也有过相同的体会.真正与外国同行接触后才会知道什么是差距,在这篇文章中我 ...
- swift开发:试玩 Apple 站点的 playground
https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_ ...
- java_redis3.0.3集群搭建
redis3.0版本之后支持Cluster,具体介绍redis集群我就不多说,了解请看redis中文简介. 首先,直接访问redis.io官网,下载redis.tar.gz,现在版本3.0.3,我下面 ...