题目链接:点击查看

题目大意:给出一个无环无向图,每个点都可以看做一个补给站,油价是固定的,每条路都要消耗一定的油量,给出q个询问,问油箱大小为c,从起点到终点所需要的最小花费

题目分析:可以用bfs+优先队列直接爆搜,我们令每个状态都是一个二元组(x,y)代表的是在x点剩y升油,则每个点(u,f)都可以更新为(u,f+1)和(v,f-w)两个状态,因为c给的很小,只有100,总的时间复杂度最差也是n*c*q=1000*100*100=1e7,在算上点常数时间开销,1秒跑完这个题也是稳稳的了。

优先队列中我维护了三个变量,分别是当前节点,当前剩余油量,当前花销,对于花销重载小于号,这样就能保证到达终点时的第一个点一定是最优解。网上我看有的题解还用动态规划的思想维护了一个二维cost数组,用来记录到x点时剩余油量为y的最小花费,我个人感觉没必要,因为用了优先队列后求出的答案一定是最优解了,如果再同时维护一个cost数组就是给自己找麻烦,但换个想法,如果用cost数组搭配普通队列或许会更快,前两天也是做了一个题,就是需要维护一个数组来进行条件判断

因为代码写的有点乱,凑活看吧,因为多次出现了结构体的调用,之后如果有空会再写写队列+动态规划的形式,说不定会快一点

直接上代码了,优先队列+bfs:

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;struct Node
{int to,w,f;Node(int TO,int W){to=TO;w=W;f=0;}Node(int TO,int W,int F){to=TO;w=W;f=F;}bool operator<(const Node& a)const{return w>a.w;}
};vector<Node>node[N];int n,m;int c,s,e;int ans;int p[N]; bool vis[N][N];bool bfs()
{memset(vis,false,sizeof(vis));priority_queue<Node>q;q.push(Node(s,0,0));vis[s][0]=true;while(!q.empty()){Node cur=q.top();q.pop();if(cur.to==e){ans=cur.w;return true;}if(cur.f<c&&!vis[cur.to][cur.f+1]){
//          vis[cur.to][cur.f+1]=true;
//不要加这句话,会WA,因为vis记录的是转移过后的状态,这里虽然也是转移状态
//但最多算是起点而不是终点,换句话说,这里更新的状态是让cost变大,我们的目的是尽可能让cost变小
//如果我们在这里将cur.to,cur.f+1这个状态标记掉了,那么可能让下面的最优解无法遍历到
//可以将这里的更新理解为初始化,然后后续肯定会有最优解来更新掉这个答案
//我反正感觉这一句话是这个程序中最难想的一个点了。。可能是我太菜了q.push(Node(cur.to,cur.w+p[cur.to],cur.f+1));}for(int i=0;i<node[cur.to].size();i++){int u=cur.to;int v=node[cur.to][i].to;int w=node[cur.to][i].w;if(cur.f<w)continue;if(vis[v][cur.f-w])continue;vis[v][cur.f-w]=true;q.push(Node(v,cur.w,cur.f-w));}}return false;
}int main()
{while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;i++){scanf("%d",p+i);node[i].clear();}while(m--){int u,v,w;scanf("%d%d%d",&u,&v,&w);node[u].push_back(Node(v,w));node[v].push_back(Node(u,w));}int q;scanf("%d",&q);while(q--){scanf("%d%d%d",&c,&s,&e);if(bfs())printf("%d\n",ans);elseprintf("impossible\n");}}return 0;
}

POJ - 3635 Full Tank?(bfs)相关推荐

  1. POJ 3635 Full Tank?

    POJ_3635 可以把图上一个点拆成C+1个点然后直接应用dij即可,同时总状态是一定的,为了减少每一步的决策量,我们可以每次加油都只加1个单位. 貌似这样的题目用dij都会比SPFA快一些,因为状 ...

  2. POJ 3414 Pots【BFS】+ Python

    原题链接: 3414 -- Pots 参考资料:POJ 3414 - Pots | 眈眈探求 POJ 3414 Pots[BFS][图搜] - it610.com 一 特别注意: 1. 每一种操作对应 ...

  3. POJ 3984 迷宫问题 BFS DFS两种解法

    题目地址:点这里 迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18495 Accepted: 10947 Descr ...

  4. POJ 2049 Finding Nemo BFS

    题目大意:给你一个奇奇怪怪的迷宫, 这个迷宫包括墙和门.再给你一个起始坐标, 问你从迷宫内到外面至少要穿越多少的门. 题目分析: 穿越多少门等同于路过了多少个格子. 为此我们可以将整个地图中的格子,门 ...

  5. POJ 3126 Prime Path BFS搜索

    题意:就是找最短的四位数素数路径 分析:然后BFS随便搜一下,复杂度最多是所有的四位素数的个数 #include<cstdio> #include<algorithm> #in ...

  6. poj 3984 迷宫问题 BFS

    /* 题目: 求最少时间从(0,0)走到(4,4)的路径 分析: 纯粹BFS题目,不过需要打印路径,可以用数组记录当前的坐标的上一个坐标, 因为BFS构造出一棵BFS最优生成树,每一个节点的父母节点都 ...

  7. POJ 3984 迷宫问题 BFS求最短路线+路径记录

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31050   Accepted: 17826 Descriptio ...

  8. POJ 2251 Dungeon Master (BFS最短路)

    三维空间里BFS最短路 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #incl ...

  9. POJ - 1475 Pushing Boxes(bfs套bfs)

    题目链接:点击查看 题目大意:要求模拟推箱子游戏的过程,输出最优路径,最优路径要求箱子移动的次数最少,次为人移动的次数最少 题目分析:这个题可以简化成两个相互依附的东西同时走迷宫,因为首先要求箱子移动 ...

最新文章

  1. nginx的gzip压缩功能
  2. Swift3.0语言教程使用Unicode范式标准化获取字符串
  3. php 压测流量回放,终极 Web 应用性能和压力测试工具 Gor
  4. ATSAMD21-XPRO开发板 评估基于 ATSAM D21 CortexM0+ 的微控制器
  5. Why Opportunity list is empty
  6. 计算机系统基础:磁盘调度知识笔记
  7. solidity事件详解
  8. 漫画:给女朋友介绍什么是 “元宇宙” ?
  9. shiro subject.getprincipal()为null_(变强、变秃)Java从零开始之Shiro安全框架
  10. OpenCV3学习(2.1)——图像Mat数据的访问-at/ptr/iterator
  11. ios图片放大之后如何不模糊_ios uiimageview的长宽放大3倍后 图片变模糊的问题
  12. 网络服务器费信息技术服务费,中山大学网络与信息技术中心网费在线系统
  13. Windows平台内核级文件访问
  14. python之使用numpy实现从二维数组中找出行(子数组)为特定值的索引
  15. ICLR'22 | 微软亚洲研究院深度学习领域最新研究成果一览
  16. Redis基础6(Redis6管道)
  17. 阿里P8好友说,要想成为Java大佬,就得要多逛逛国外的这几个技术网站...
  18. 不需要appuploader破解版,也能上架
  19. java开发自学怎么样_Java工程师的薪资待遇怎么样,自学Java开发可以吗?
  20. 研究生期间各方面规划

热门文章

  1. Spring反转控制
  2. 分布式架构中分布式事务
  3. 开发中为什么使用线程池的原因
  4. canal数据同步(canal安装)
  5. request获得请求行的内容
  6. (常用API)正则表达式语法规则
  7. Hive和Hadoop及RDBMS关系
  8. RocketMQ错误消息重试策略之Consumer的重试机制(Exception情况)
  9. IDEA连接Mysql报错: 未找到驱动程序类 ‘com.mysql.cj.jdbc.Driver‘.  Change driver class
  10. 深入理解GCD之dispatch_queue