题目

Description

已知每个点的加油站的油价单价(即点权),每条路的长度(边权)。

有q个询问,每个询问包括起点s、终点e和油箱容量c。

问从起点走到终点的最小花费。如果不可达输出impossible,否则输出最小的旅途费用。

Solution

第一想法想到拆点,每个点拆成 0~c 那么多个点,妥妥TLE。

后来看题解想到可以进行一个最短路DP,用一个三元组 (x,y,z) 表示当前在点 x,花了 y 元,油量为 z,把这个压进优先队列,每次取出堆中 y 最少的点进行更新即可。

这里还有个奇技淫巧般的优化,就是每次取出堆顶时,不用从当前直接把油箱加满,只加 1 单位的油量就够了,这是为什么呢?其实跟飞扬的小鸟一样,为了优化时间,我们可以让 dp 从自己向自己转移,也就是说,这次只加 1 单位,下次取出时还是只加 1 单位,那么迟早会遍历所有的 n*c 状态。

哦对还要注意一点,vis 数组不要在 if 里面更新,要在取到它的时候再变为 1,不然早早变为 1 有可能让能令其更优的状态无法转移过来。

Code

// By YoungNeal
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

int T;
int c,s,e;
int n,m,cnt;
];
];
][];
][];

struct Edge{
    int nxt,to,dis;
}edge[];

void add(int x,int y,int z){
    edge[++cnt].to=y;
    edge[cnt].nxt=head[x];
    edge[cnt].dis=z;
    head[x]=cnt;
}

struct Node{
    int now,dis,oil;
    Node(,,):now(now),dis(dis),oil(oil){}
    friend bool operator<(Node a,Node b){
        return a.dis>b.dis;
    }
};

priority_queue<Node> pq;

void dij(){
    while(pq.size()) pq.pop();
    pq.push(Node(s,,));
    while(pq.size()){
        Node p=pq.top();pq.pop();
        int o=p.oil,u=p.now;
        if(vis[u][o]) continue;
        vis[u][o]=;
        if(u==e){
            printf("%d\n",p.dis);
            return;
        }
        <=c&&!vis[u][o+]&&dis[u][o+]>dis[u][o]+val[u]){
            dis[u][o+]=p.dis+val[u];
            pq.push(Node(u,p.dis+val[u],o+));
        }
        for(int i=head[u];i;i=edge[i].nxt){
            int to=edge[i].to;
            int w=edge[i].dis;
            if(o>=w&&!vis[to][o-w]&&dis[to][o-w]>p.dis){
                dis[to][o-w]=p.dis;
                pq.push(Node(to,p.dis,o-w));
            }
        }
    }
    printf("impossible\n");
}

signed main(){
    scanf("%d%d",&n,&m);
    ;i<=n;i++) scanf("%d",&val[i]);
    ;i<=m;i++){
        scanf("%d%d%d",&x,&y,&z);
        add(x+,y+,z);
        add(y+,x+,z);
    }
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&c,&s,&e);
        s++,e++;
        memset(vis,,sizeof vis);
        memset(dis,0x3f,sizeof dis);
        dis[s][]=;
        dij();
    }
    ;
}

[POJ 3635] Full Tank?的更多相关文章

  1. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  2. POJ 3635 Full Tank? 【分层图/最短路dp】

    任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  3. POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...

  4. poj 3635 Full Tank? ( bfs+dp思想 )

    Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5857   Accepted: 1920 Descri ...

  5. poj 3635 Full Tank? ( 图上dp )

    题意: 已知每一个点的加油站的油价单位价格(即点权).每条路的长度(边权). 有q个询问.每一个询问包含起点s.终点e和油箱容量. 问从起点走到终点的最小花费.假设不可达输出impossible,否则 ...

  6. 【POJ 3635】 Full Tank

    [题目链接] http://poj.org/problem?id=3635 [算法] 优先队列BFS 实现类似于堆优化dijkstra [代码] #include <algorithm> ...

  7. Full Tank? POJ - 3635 (bfs | 最短路)

    After going through the receipts from your car trip through Europe this summer, you realised that th ...

  8. poj 3635/hdu 1676 Full Tank? 车辆加油+最短路

    http://acm.hdu.edu.cn/showproblem.php?pid=1676 给出一张图,n<=1000,m<=10000. 有一辆车想从图的一个地方到达另外一个地方,每个 ...

  9. poj 3635(bfs+优先队列)

    题目链接:http://poj.org/problem?id=3635 思路:本题主要运用的还是贪心思想,由于要求st->ed的最小花费,那么每经过一个城市,能不加油就尽量不加油,用dp[i][ ...

随机推荐

  1. hive:框架理解

    1. 什么是hive  •Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. •本质是将HQL转换为MapReduce程序  2. 为什么 ...

  2. 新手福音︱正则表达式小工具RegExr

    由于之前在做NLP的内容,势必会接触正则表达式,但是呢,又觉得这个学不明白- 于是,这个工具还是蛮不错的,相当于在线正则速查+验证小工具,对于我这样的新手值得去玩玩. github:https://g ...

  3. Cramfs、JFFS2、YAFFS2全面对比

     由 于嵌入式系统自身存在一些特殊要求使得一些传 统的文件系统 (如FAT.EXT2等) 并不十分适合.专 用的嵌入式文件系统应有一些自身的特性如文件系统 面对的储存介质特殊性.文件系统应具有的跨 ...

  4. PLSQL Developer报错(一)

    PLSQL Developer报错(一) 今天,我遇到了一个奇怪的问题,PLSQL Developer连接不上数据库,而且配置和数据库用户名密码都正确. 查找了半天的资料,也没有发现什么解决的办法.实 ...

  5. 用vlc搭建简单流媒体服务器(UDP和TCP方式)

    .UDP(legacy)传统模式 .RTP方式 .RTSP方式 RTSP方式是通过RTP进行流媒体数据的传输的,VLC的实现也是基于UDP的.这种方式网上的参考资料比较多,我就不截图了,直接叙述命令行 ...

  6. WDF驱动的编译、调试、安装

    编译和调试使用WDK编译,源代码应包括wdf.h,ntddk.h以及KMDF_VERSION=1,编译使用/GS.KMDF包括以下库:1). WdfDriverEntry.lib(编译时绑定):驱动入 ...

  7. SecurityError:Error:#2148

    1.错误描述 SecurityError:Error:#2148:SWF文件http://localhost:8888/UploadDownload/Flash/ReadLocalFile.swf/[ ...

  8. window.load 和$(document).ready() 区别

    1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕.2.编写个数不同 w ...

  9. xml的xPath解析规则

    一,为什么要用xpath技术 问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!! 二,xpath的规则 2.1,/根元素的案例 /AAA 选择根元素AAA       ...

  10. ASP.NET 初识Cookie

    1.ASP.NET中使用Cookie 0.说明 Cookie存在客户端电脑上,Session存在服务器上,所以保存登录信息等敏感信息时不能使用Cookie,用户个性化设置可以使用Cookie 1.新建 ...