博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1772 [ZJOI2006]物流运输
阅读量:5743 次
发布时间:2019-06-18

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

SPFA+DP

常数奇大的线段树维护那些天不能走

// luogu-judger-enable-o2#include
#include
#include
#include
#include
using namespace std;vector
line[250];vector
cost[250];struct segment_tree{ bool val[700]; bool tag[700]; void push_down(int root) { val[root<<1]|=tag[root]; val[root<<1|1]|=tag[root]; tag[root<<1]|=tag[root]; tag[root<<1|1]|=tag[root]; tag[root]=false; return ; } void updata(int root,int nl,int nr,int l,int r,int value) { if(nl>r||nr
=l&&nr<=r) { val[root]|=value; tag[root]|=value; return ; } int mid=(nl+nr)>>1; push_down(root); updata(root<<1,nl,mid,l,r,value); updata(root<<1|1,mid+1,nr,l,r,value); val[root]=val[root<<1]|val[root<<1|1]; return ; } bool check(int root,int nl,int nr,int l,int r) { if(nl>r||nr
=l&&nr<=r) return val[root]; push_down(root); int mid=(nl+nr)>>1; return check(root<<1,nl,mid,l,r)|check(root<<1|1,mid+1,nr,l,r); }};segment_tree point[51];long long dis[201][201];long long n,m,k,e;queue
q;bool inque[201];long long SPFA(int begin,int end,int s,int t){ inque[begin]=true; q.push(begin); long long dist[201]; for(int i=1;i<=40;i++) dist[i]=1e+9; dist[begin]=0; while(!q.empty()) { int pas=q.front(); q.pop(); inque[pas]=false; for(int i=0;i
dist[pas]+spend) { dist[nxt]=dist[pas]+spend; if(!inque[nxt]) { q.push(nxt); inque[nxt]=true; } } } } return dist[end];}int main(){ scanf("%d%d%d%d",&n,&m,&k,&e); long long a,b,c; for(int i=1;i<=e;i++) { scanf("%d%d%d",&a,&b,&c); line[a].push_back(b); line[b].push_back(a); cost[a].push_back(c); cost[b].push_back(c); } int d; scanf("%d",&d); for(int i=1;i<=d;i++) { scanf("%d%d%d",&a,&b,&c); point[a].updata(1,1,n,b,c,true); } for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) { int ha=SPFA(1,m,j,i); if(ha==1e+9) { dis[j][i]=0x7ffffffff; continue; } dis[j][i]=ha*(i-j+1); } for(int i=1;i<=n;i++) for(int j=1;j<=i-1;j++) dis[1][i]=min(dis[1][j]+dis[j+1][i]+k,dis[1][i]); printf("%d",dis[1][n]);}

转载于:https://www.cnblogs.com/Lance1ot/p/9062459.html

你可能感兴趣的文章