3 条题解
-
-2
直接分层图,然后注意每个点只需要连他下一层就行,连多了就T飞了
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; bool Test_MLE_start; constexpr int N=1e3+10,M=1e5+10,MAXT=205; int _=1,n,m,T,maxT,tot=0,ans=2e9,head[N],tp[N],dis[N][MAXT]; bool vis[N][MAXT];struct edge{int v,w,x,nxt;}a[M<<1]; struct node{ int u,val,t; friend bool operator <(const node A,const node B){return A.val>B.val;} };priority_queue<node> q; inline int reads(){ int c=getchar(),x=0,f=1; while(!isdigit(c)){if(c=='-') f=-1;c=getchar();} while(isdigit(c)){x=(x<<3)+(x<<1)+(c^'0');c=getchar();} return x*f; }inline void files(){ freopen("B.in","r",stdin); // freopen("std.out","w",stdout); }inline void clr(){ // Don't forget! }void add(int u,int v,int w,int x){ a[++tot].v=v,a[tot].w=w,a[tot].x=x; a[tot].nxt=head[u]; head[u]=tot; }void dijkstra(int u,int t){ memset(dis,0x3f,sizeof(dis)); dis[u][t]=0,q.push(node{u,0,t}); while(!q.empty()){ int u=q.top().u,t=q.top().t;q.pop(); if(vis[u][t]) continue;vis[u][t]=1; if(u==n){ printf("%d\n",dis[n][t]); exit(0); } if(t+1<=maxT&&dis[u][t+1]>dis[u][t]+tp[u]){ dis[u][t+1]=dis[u][t]+tp[u]; q.push(node{u,dis[u][t+1],t+1}); }for(int i=head[u];i;i=a[i].nxt){ int v=a[i].v,x=a[i].x; if(t<x) continue; if(dis[v][t-x]>dis[u][t]+a[i].w){ dis[v][t-x]=dis[u][t]+a[i].w; q.push(node{v,dis[v][t-x],t-x}); } } } } bool Test_MLE_end; signed main(){ // printf("%lf Mb\n",(&Test_MLE_end-&Test_MLE_start-1)/1024.0/1024.0); // files(); // _=reads(); while(_--){ clr();n=reads(),m=reads(),T=reads(),maxT=reads(); for(int i=1;i<=n;i++) tp[i]=reads(); for(int i=1;i<=m;i++){ int u,v,w,x;u=reads(),v=reads(),x=reads(),w=reads(); add(u,v,w,x),add(v,u,w,x); }dijkstra(1,T); for(int i=0;i<=maxT;i++) ans=min(ans,dis[n][i]); printf("%d\n",ans); }return 0; }
信息
- ID
- 572
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 77
- 已通过
- 12
- 上传者