【jzoj3891】【钻石交易】【动态规划】【最短路】
2017-01-20 16:38
537 查看
题目大意
解题思路
枚举钻石买卖情况,通过spfa更新当前情况停留在所有点的答案,再考虑再停留点卖钻石的情况。
code
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define LF double #define LL long long #define min(a,b) ((a<b)?a:b) #define max(a,b) ((a>b)?a:b) #define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) using namespace std; int const maxn=1500,maxt=4000,inf=1e9; int n,m,t,K,S,gra,a[maxn+10][11],to[maxt+10],len[maxt+10],next[maxt+10], begin[maxn+10],qu[maxn*4+10],inq[maxn+10],F[1024+10][maxn+10]; void insert(int u,int v,int w){ to[++gra]=v; len[gra]=w; next[gra]=begin[u]; begin[u]=gra; } int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%d%d%d%d%d",&n,&t,&m,&K,&S); fo(i,1,n)fo(j,1,m)scanf("%d",&a[i][j]);int u,v,w; fo(i,1,t){ scanf("%d%d%d",&u,&v,&w); insert(u,v,w); } int mx=(1<<m)-1; fo(i,0,mx)fo(j,1,n)F[i][j]=-inf; F[0][S]=K; fo(s,0,mx-1){ int he=0,ti=0; fo(j,1,n)if(F[s][j]>=0)inq[qu[++ti]=j]=1; while(he!=ti){ int now=qu[++he]; for(int i=begin[now];i;i=next[i]) if((F[s][now]-len[i]>=0)&&(F[s][to[i]]<=F[s][now]-len[i])){ F[s][to[i]]=F[s][now]-len[i]; if(!inq[to[i]])inq[qu[++ti]=to[i]]=1; } inq[now]=0; }fo(j,1,n)if(F[s][j]>=0)fo(k,1,m)if(!(s&(1<<(k-1))))F[s|(1<<(k-1))][j]=max(F[s|(1<<(k-1))][j],F[s][j]+a[j][k]); } int ans=0; fo(i,1,n)ans=max(ans,F[mx][i]); printf("%d",ans); return 0; }
相关文章推荐
- System.getProperties和System.getenv区别
- android双击退出App
- 小程序 之 require 请求数据绑定
- INF文件详解
- 智能指针
- jQuery
- [线段树][区间修改&&查询]
- MongoDB 查询总结
- 多线程——线程死锁
- 关闭firefox火狐浏览器下载完成时自动扫描(49.0.2以后版本)
- platform设备的添加
- DNS子域授权
- 一款非常好用的日期插件(强烈推荐)
- 写代码注意
- win10下iis绑定局域网ip无效的解决方案
- 零线断了为什么会带电, 使验电笔氖管发光
- DDS作业(作业3)
- android架构师导图
- 第四十四篇:重写U-BOOT中的xHCI host代码
- 三角函数之倍角公式