• 汽车加油行驶问题


    汽车加油行驶问题
    网络流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
    ",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);
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    未格式化的输入/输出操作
    格式化输入与输出
    随机数
    正则表达式
    bitset
    tuple
    servlet笔记
    springside
    maven
    Lua简易入门教程
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9263899.html
Copyright © 2020-2023  润新知