POJ - 3635 Full Tank?(bfs)
题目链接:点击查看
题目大意:给出一个无环无向图,每个点都可以看做一个补给站,油价是固定的,每条路都要消耗一定的油量,给出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)相关推荐
- POJ 3635 Full Tank?
POJ_3635 可以把图上一个点拆成C+1个点然后直接应用dij即可,同时总状态是一定的,为了减少每一步的决策量,我们可以每次加油都只加1个单位. 貌似这样的题目用dij都会比SPFA快一些,因为状 ...
- POJ 3414 Pots【BFS】+ Python
原题链接: 3414 -- Pots 参考资料:POJ 3414 - Pots | 眈眈探求 POJ 3414 Pots[BFS][图搜] - it610.com 一 特别注意: 1. 每一种操作对应 ...
- POJ 3984 迷宫问题 BFS DFS两种解法
题目地址:点这里 迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18495 Accepted: 10947 Descr ...
- POJ 2049 Finding Nemo BFS
题目大意:给你一个奇奇怪怪的迷宫, 这个迷宫包括墙和门.再给你一个起始坐标, 问你从迷宫内到外面至少要穿越多少的门. 题目分析: 穿越多少门等同于路过了多少个格子. 为此我们可以将整个地图中的格子,门 ...
- POJ 3126 Prime Path BFS搜索
题意:就是找最短的四位数素数路径 分析:然后BFS随便搜一下,复杂度最多是所有的四位素数的个数 #include<cstdio> #include<algorithm> #in ...
- poj 3984 迷宫问题 BFS
/* 题目: 求最少时间从(0,0)走到(4,4)的路径 分析: 纯粹BFS题目,不过需要打印路径,可以用数组记录当前的坐标的上一个坐标, 因为BFS构造出一棵BFS最优生成树,每一个节点的父母节点都 ...
- POJ 3984 迷宫问题 BFS求最短路线+路径记录
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31050 Accepted: 17826 Descriptio ...
- POJ 2251 Dungeon Master (BFS最短路)
三维空间里BFS最短路 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #incl ...
- POJ - 1475 Pushing Boxes(bfs套bfs)
题目链接:点击查看 题目大意:要求模拟推箱子游戏的过程,输出最优路径,最优路径要求箱子移动的次数最少,次为人移动的次数最少 题目分析:这个题可以简化成两个相互依附的东西同时走迷宫,因为首先要求箱子移动 ...
最新文章
- nginx的gzip压缩功能
- Swift3.0语言教程使用Unicode范式标准化获取字符串
- php 压测流量回放,终极 Web 应用性能和压力测试工具 Gor
- ATSAMD21-XPRO开发板 评估基于 ATSAM D21 CortexM0+ 的微控制器
- Why Opportunity list is empty
- 计算机系统基础:磁盘调度知识笔记
- solidity事件详解
- 漫画:给女朋友介绍什么是 “元宇宙” ?
- shiro subject.getprincipal()为null_(变强、变秃)Java从零开始之Shiro安全框架
- OpenCV3学习(2.1)——图像Mat数据的访问-at/ptr/iterator
- ios图片放大之后如何不模糊_ios uiimageview的长宽放大3倍后 图片变模糊的问题
- 网络服务器费信息技术服务费,中山大学网络与信息技术中心网费在线系统
- Windows平台内核级文件访问
- python之使用numpy实现从二维数组中找出行(子数组)为特定值的索引
- ICLR'22 | 微软亚洲研究院深度学习领域最新研究成果一览
- Redis基础6(Redis6管道)
- 阿里P8好友说,要想成为Java大佬,就得要多逛逛国外的这几个技术网站...
- 不需要appuploader破解版,也能上架
- java开发自学怎么样_Java工程师的薪资待遇怎么样,自学Java开发可以吗?
- 研究生期间各方面规划
热门文章
- Spring反转控制
- 分布式架构中分布式事务
- 开发中为什么使用线程池的原因
- canal数据同步(canal安装)
- request获得请求行的内容
- (常用API)正则表达式语法规则
- Hive和Hadoop及RDBMS关系
- RocketMQ错误消息重试策略之Consumer的重试机制(Exception情况)
- IDEA连接Mysql报错: 未找到驱动程序类 ‘com.mysql.cj.jdbc.Driver‘. Change driver class
- 深入理解GCD之dispatch_queue