博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1565 网络流或状态压缩DP
阅读量:4679 次
发布时间:2019-06-09

本文共 1948 字,大约阅读时间需要 6 分钟。

对于网络流有一个定理:

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

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

网络流解法代码如下:

#include
#include
#include
#include
#define N 1010#define M 50010#define inf 1<<30using 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=0; edge[e].next=index[to]; index[to]=e++;}int source,des,n,m;//n is the number of pointint dfs(int pos,int flow){ if(pos==des) return flow; int i,j,v,val,lv,mind,c; mind=n-1;//初始最小标号为n-1 lv=flow; for(i=index[pos];i!=-1;i=edge[i].next) { v=edge[i].to; val=edge[i].val; if(val) { if(d[v]+1==d[pos]) { c=min(lv,val);//对于该点的最小可行流 c=dfs(v,c); edge[i].val-=c;//更新剩余图 edge[i^1].val+=c; lv-=c; if(d[source]>=n)return flow-lv; if(lv==0) break; } if(d[v]
1) addedge(pos(i,j),pos(i-1,j),inf); if(j>1) addedge(pos(i,j),pos(i,j-1),inf); } else addedge(pos(i,j),m*m+1,w); } n=m*m+2; printf("%d\n",sum-sap(0,n-1)); } return 0;}

 状态压缩解法:

#include
#include
#include
#include
#include
using namespace std;int s[1<<21];int map[22][22];int dp[2][1<<21];int main(){ int n,i,j,t,k,num=0;; n=1<<21; for(i=0;i<=n;i++)//记录可行状态 if((i&(i<<1))==0) s[num++]=i; while(scanf("%d",&n)!=EOF) { for(i=0;i
(1<
(1<

 

转载于:https://www.cnblogs.com/wangfang20/p/3178550.html

你可能感兴趣的文章
谷歌浏览器,添加默认搜索引擎的搜索地址
查看>>
数据结构化与保存
查看>>
为什么需要Docker?
查看>>
国内5家云服务厂商 HTTPS 安全性测试横向对比
查看>>
how to control project
查看>>
转 python新手容易犯的6个错误
查看>>
第四节 -- 列表
查看>>
决策树
查看>>
团队作业
查看>>
如何避免在简单业务逻辑上面的细节上面出错
查看>>
大型网站高并发的架构演变图-摘自网络
查看>>
8丶运行及总结
查看>>
WebApi请求原理
查看>>
[Node.js] node-persist: localStorage on the server
查看>>
jquery.event 研究学习之bind篇
查看>>
LOJ #108. 多项式乘法
查看>>
libusb开发指南
查看>>
SAS基础 -- 逻辑库不存在问题解决
查看>>
Servlet监听器统计在线人数
查看>>
关于手机端IOS系统微信中虚拟键盘遮挡input输入框问题的解决方案 草稿
查看>>