汽車加油行駛問題
阿新 • • 發佈:2018-07-04
== n) str pop memset mem del main can
汽車加油行駛問題
網絡流24題中的,單好像不用費用流水過更快?(我沒測過)
廣搜搞一下,按剩余油量分層。
#include <queue> #include <cstdio> #include <cstring> const int dx[4]= {0,0,1,-1},dy[4]= {1,-1,0,0}; int n,k,a,b,c,g[105][105],dis[105][105][15],ans=0x3f3f3f3f; struct node {int x,y,rest,money;}; std::queue<node>q; int main() { scanf("%d%d%d%d%d",&n,&k,&a,&b,&c); // printf("%d %d %d\n",a,b,c); for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)scanf("%d",&g[i][j]); std::memset(dis,0x3f,sizeof dis); dis[1][1][k]=0;node u; u.money=0,u.rest=k,u.x=1,u.y=1; q.push(u); while(!q.empty()) { u=q.front(); q.pop(); int x=u.x,y=u.y; for(int i=0; i<4; i++) { int nx=dx[i]+x,ny=dy[i]+y,cost=u.money; if(nx<=0||nx>n||ny<=0||ny>n)continue; if(dx[i]<0||dy[i]<0) cost+=b; if(g[nx][ny]) { cost+=a; if(dis[nx][ny][k]<=cost)continue; dis[nx][ny][k]=cost; q.push({nx,ny,k,cost}); } else { if(u.rest==1){ if(nx==n&&ny==n) if(ans>cost){ans=cost;continue;} cost+=c+a; if(cost<dis[nx][ny][k])dis[nx][ny][k]=cost; else continue; q.push({nx,ny,k,cost}); } else { if(nx==n&&ny==n) if(ans>cost){ans=cost;continue;} bool flag=0; for(int z=u.rest-1;z<=k;z++) if(dis[nx][ny][z]<=cost) {flag=1;break;} if(flag) continue; dis[nx][ny][u.rest-1]=cost; q.push({nx,ny,u.rest-1,cost}); } } } } printf("%d",ans); }
汽車加油行駛問題