【网络流24题】汽车加油行驶问题

这篇博客探讨了如何运用Dijkstra算法解决汽车在行驶过程中的加油问题,通过建立状态f[i][j][k]表示坐标(i, j)剩余油量为k,通过最短路径算法求解。" 79202694,7352521,微博爬虫实践:使用cookie轻松抓取数据,"['爬虫', 'python', '微博API', '数据抓取', '网络爬虫']
摘要由CSDN通过智能技术生成

(网络流24题大多需要spj,所以需要一个有spj的oj,本系列代码均在www.oj.swust.edu.cn测试通过)
不知道为什么回混进来这么多奇怪的问题,老子的网络流呢?
这道题只要把搞一个状态f[i][j][k]表示坐标为(i,j)的点剩余油量为k,按照题目描述跑一边最短路即可。
唉,不含加油费活生生让我看成了不用加油费,读题杀要死人啊。
Dijkstra让我活生生改了个名,不要在意哦

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<string>
#include<cstring>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
using namespace std;
int n,va,vb,vc;
int dis[101][101][11];
struct point
{
    int x,y,k;
    point (int _,int __,int ___):x(_),y(__),k(___){}
    bool operator <(point b) const
    {
        return dis[x][y][k]>dis[b.x][b.y][b.k];
    }
};
priority_queue<point> my_queue;
int k;
bool pd[101][101][11];
int mapp[101][101];
int xx[4]={-1,0,1,0};
int yy[4]={0,-1,0,1};
void djstra()
{
    memset(dis,0x1f,sizeof(dis));
    dis[1][1][k]=0;
    my_queue.push(point(1,1,k));
    while(!my_queue.empty())
    {
        point mid=my_queue.top();
        my_queue.pop();
        while(pd[mid.x][mid.y][mid.k] && !my_queue.empty()) mid=my_queue.top(),my_queue.pop();
        if(pd[mid.x][mid.y][mid.k]) break;
        pd[mid.x][mid.y][mid.k]=true;
        if(mid.x==n && mid.y==n)
        {
            cout<<dis[mid.x][mid.y][mid.k];
            exit(0);
        }
        if(mid.k==0) continue;
        for(int i=0;i<4;i++)
        {
            int nx=mid.x+xx[i];
            int ny=mid.y+yy[i];
            if(nx<1 || nx>n || ny<1 || ny>n) continue;
            int ercost=0;
            if(i<2) ercost=vb;
            if(mapp[nx][ny]==1)
            {
                if(dis[mid.x][mid.y][mid.k]+ercost+va<dis[nx][ny][k])
                {
                    dis[nx][ny][k]=dis[mid.x][mid.y][mid.k]+ercost+va;
                    my_queue.push(point(nx,ny,k));
                }
            }
            else
            {
                if(dis[mid.x][mid.y][mid.k]+ercost+vc+va<dis[nx][ny][k])
                {
                    dis[nx][ny][k]=dis[mid.x][mid.y][mid.k]+ercost+vc+va;
                    my_queue.push(point(nx,ny,k));
                }
            }
            if(mapp[nx][ny]) continue;
            if(dis[mid.x][mid.y][mid.k]+ercost<dis[nx][ny][mid.k-1])
            {
                dis[nx][ny][mid.k-1]=dis[mid.x][mid.y][mid.k]+ercost;
                my_queue.push(point(nx,ny,mid.k-1));
            }
        }
    }
}
int main()
{
    scanf("%d%d%d%d%d",&n,&k,&va,&vb,&vc);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&mapp[i][j]);
    djstra();
    return 0;
}
问题描述(完全解决) 给定一个N*N 的方形网格,设其左上角为起点,坐标为(1,1),X轴向右为正,Y轴向下为正,每个方格边长为1。一辆汽车从起点出发驶向右下角终点,其坐标为(N,N)。 在若干个网格交叉点处,设置了油库,可供汽车行驶途中加油汽车行驶过程中应遵守如下规则: (1)汽车只能沿网格边行驶,装满油后能行驶K条网格边。出发时汽车已装满油,在起点与终点处不设油库。 (2)当汽车行驶经过一条网格边时,若其X坐标或Y坐标减小,则应付费用B,否则免付费用。 (3)汽车行驶过程中遇油库则应加满油并付加油费用A。 (4)在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费用A)。 (5)(1)~(4)中的各数N、K、A、B、C均为正整数。 你的任务:求汽车从起点出发到达终点的一条所付费用最少的行驶路线。 输入 有若干组数据。每组数据的第一行是N,K,A,B,C的值,2 £ N £ 100,2 £ K £ 10。第二行起是一个N*N 的0-1方阵,每行N个值,至N+1行结束。方阵的第i行第j列处的值为1表示在网格交叉点(i,j)处设置了一个油库,为0时表示未设油库。各行相邻的2 个数以空格分隔。 输出 对每组测试数据,一行输出找到的最优行驶路线所需的费用值。 输入样例 9 3 2 3 6 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 输出样例 12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值