题干:

高玩小Q不仅喜欢玩寻宝游戏,还喜欢一款升级养成类游戏。在这个游戏的世界地图中一共有nn个城镇,编号依次为11到nn。

这些城镇之间有mm条单向道路,第ii 条单项道路包含四个参数ui,vi,ai,biui,vi,ai,bi,表示一条从uiui号城镇出发,在vivi号城镇结束的单向道路,因为是单向道路,这不意味着小Q可以从vivi沿着该道路走到uiui。小Q的初始等级levellevel为11,每当试图经过一条道路时,需要支付cost=log2level+ailevelcost=log2⁡level+ailevel点积分,并且经过该道路后,小Q的等级会提升aiai级,到达level+ailevel+ai级。但是每条道路都会在一定意义上歧视低消费玩家,准确地说,如果该次所需积分cost<bicost<bi,那么小Q不能经过该次道路,也不能提升相应的等级。

注意:本游戏中等级为正整数,但是积分可以是任意实数。

小Q位于11号城镇,等级为11,现在为了做任务要到nn号城镇去。这将会是一次奢侈的旅行,请写一个程序帮助小Q找到需要支付的总积分最少的一条路线,或判断这是不可能的。

Input

第一行包含一个正整数T(1≤T≤30)T(1≤T≤30),表示测试数据的组数。

每组数据第一行包含两个整数n,m(2≤n≤100000,1≤m≤200000)n,m(2≤n≤100000,1≤m≤200000),表示城镇数和道路数。

接下来mm行,每行四个整数ui,vi,ai,bi(1≤ui,vi≤n,ui≠vi,0≤ai≤109,0≤bi≤60)ui,vi,ai,bi(1≤ui,vi≤n,ui≠vi,0≤ai≤109,0≤bi≤60),分别表示每条单向道路。

Output

对于每组数据,输出一行一个整数,即最少所需的总积分的整数部分,如:4.99994.9999输出44,1.01.0输出11。若不存在合法路线请输出−1−1。

Sample Input

1
3 3
1 2 3 2
2 3 1 6
1 3 5 0

Sample Output

2

解题报告:

具体的题目的分析  博客   。总之就是把公式化简一下(即考虑从1号点开始到各个点的cost)发现根本用不到level而是只跟ai有关,所以只需要dis数组中是ai的和的最小值即可,最后答案中在取个log2,就是答案了。判断b的时候(即是否能走这条线)刚开始理解错了,理解成了跟level有关,但是其实没关系,只跟ai有关,而ai更开始也理解错了,,不是从起点到该点的level和,而是这条边自带的权值!总之还是没读好题。。而且判断b的时候的cost也是该边的cost而非从起点过来的cost!通过公式化简(指数函数的运算)就很容易求出该边的cost和bi之间的关系来进行continue;

刚开始还觉得不同路径走的时候level也不一样啊比如我都是走到5号点,一个是2号(比如这个点level是3)过来的,一个是4号点过来的(可能这个点的level是2),所以相当于有很多权值的限制啊!但是比赛的时候就得反过来想啊,,这么麻烦的话怎么可能有ac的呢?所以肯定有化简的方法,,比如从公式入手,,发现这个对数函数刚好可以都约掉中间项所以只和终点有关,和路径无关。还是要多做题多总结啊!给公式的题往往可以公式入手!

AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 100000 + 5;
const int MAXE = 200000 + 5;int n,m;
int cnt;
int head[MAXN] ;
ll dis[MAXN];
bool vis[MAXN];
struct Edge {int to;ll a;ll b;int ne;
} e[MAXE];
struct Point {int pos;ll cost;Point(){}Point(int pos,ll cost):pos(pos),cost(cost){}bool operator<(const Point b)const {return cost > b.cost;}
};
void add(int u,int v,ll a,ll b) {e[cnt].to = v;e[cnt].a = a;e[cnt].b = b;e[cnt].ne = head[u];head[u] = cnt++;
}
void Dijkstra(int st) {priority_queue<Point > pq;dis[st] = 1;pq.push(Point(st,1));while(!pq.empty()) {Point cur = pq.top();pq.pop();if(vis[cur.pos] == 1) continue;vis[cur.pos] = 1;for(int i = head[cur.pos]; i!=-1; i=e[i].ne) {if(1 + e[i].a/cur.cost < pow(2,e[i].b)) continue;//这里的pow其实可以找个数组预处理一下 if(dis[cur.pos] + e[i].a < dis[e[i].to] ) {dis[e[i].to] = cur.cost+ e[i].a;//把dis[cur.pos]换成cur.cost行吗? pq.push(Point(e[i].to,dis[e[i].to]));   }}} }
int main()
{int t;cin>>t;//顶点1~nint u,v;ll a,b;while(t--) {cnt = 0;memset(vis,0,sizeof(vis));memset(head,-1,sizeof(head));//别想当然写0scanf("%d%d",&n,&m);       for(int i = 1; i<=n; i++) dis[i] = LLONG_MAX;//别把这一步放在读入n、m前面。。。 while(m--) {scanf("%d%d%lld%lld",&u,&v,&a,&b);add(u,v,a,b);}Dijkstra(1);
//      printf("%lld\n\n\n",dis[n]); printf("%.0f\n",dis[n] == LLONG_MAX ? -1 : floor(log2(dis[n])));}return 0 ;
}

总结:

别把初始化放在读入m、n前面。。

Dijkstra 中//把dis[cur.pos]换成cur.cost行吗?    是可以的,但是还是写前者比较好,因为Point结构体中这个变量其实就是储存一下为了排序的,不是为了用的。。。

【HDU - 6290】 奢侈的旅行 (对题目预处理 + DIjkstra最短路)相关推荐

  1. HDU-6290 奢侈的旅行 2018女赛 Dijkstra堆优化

    又因为cost=log2∗((level+ai)/level)cost=log2*((level+a_i)/level)cost=log2∗((level+ai​)/level),cost会带着log ...

  2. HDU 2066-一个人的旅行(图论)

    HDU 2066-一个人的旅行 题目原址 [http://acm.hdu.edu.cn/showproblem.php?pid=2066] 题意 给定一些起点,一些终点,和一些边的权,构成一个无向图, ...

  3. HDU-6290_奢侈的旅行(Dijstra+堆优化)

    奢侈的旅行 Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Problem De ...

  4. 【每日一题】7月7日题目精讲—最短路

    来源:牛客网: 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097152K 64bit IO Format: %ll ...

  5. HDU - 5637 Transform (思维、bfs预处理)

    HDU - 5637 题目大意: 给出n个数的序列a,对于一个整数x,有两种操作: 1.改变x二进制中任一位 2.将x变为x^a[i] m次查询,每次查询输入两个整数x和y,问x最少经过多少次操作可以 ...

  6. hdu(杭电oj)第一页题目题解

    第一页有几题没写,有机会补上(嗯,忘了就是另一回事了). 这个是无聊的时候刷了第一页..存到博客上当做纪念吧.. hdu1000 简单题 难度1 计算a+b的值 hdu1001 简单题 难度1 计算1 ...

  7. HDU OJ ACM Steps 上的题目详细介绍

    之前在杭电 OJ 上做题,看到有 ACM Steps 这个链接,进去之后发现是一个类似于闯关的机制,可以增加做题人的激情--据说完全通关后会有奖励,不知道是不是真的.但是里面没有题目的分类介绍,每一关 ...

  8. hdu 2233 机器人的旅行

    机器人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. HDU 2066-一个人的旅行(最短路Dijkstra)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

最新文章

  1. 全球及中国生物柴油行业产量规模及市场消费需求预测报告2021-2027年
  2. 图解设计模式-Abstract Factory模式
  3. 解决:delphi7 license is invalid or has expired
  4. asp.net发布网站的详细步骤
  5. 【转】刨根究底字符编码之七——ANSI编码与代码页
  6. dbscan算法中 参数的意义_无监督机器学习中,最常见的聚类算法有哪些?
  7. 给你的网站https一下
  8. mac 版ideal 查找类_4款mac窗口切换工具 提高你的工作效率
  9. 大数据之-Hadoop3.x_MapReduce_数据压缩---大数据之hadoop3.x工作笔记0138
  10. 1.3 jieba分词运用:词云、关键词抽取、TextRank、TF-IDF
  11. 也来说说C#异步委托
  12. 史上最全的自动驾驶研究报告(下)
  13. Oracle 从入门到精通系列 - 思维导图计划
  14. 电脑装机完没有efi_win7系统eFI引导从硬盘安装的操作方法
  15. C# selenium设置具有账号密码的代理IP
  16. GuestOS? HostOS?
  17. 电脑诊断出策略服务器未运行,IE浏览器打不开,诊断策略服务未运行
  18. 58到家,或将到不了家
  19. 大牛总结 Elastic Search 概述(一)
  20. 铁路通信线路、传输及接入网设计规范_信号系统车地传输技术方案讨论

热门文章

  1. ios php rsa,RSA 加密 iOS
  2. win10计算机启动一分钟重启,Win10开机提示电脑将在一分钟后自动重启怎么办?...
  3. xadsafe做暗刷_手把手教你如何去掉网吧广告之PUBWin2015_XADSAFE
  4. android开发蓝牙是否可见开关_如何从后台开启android蓝牙的可见性以及始终保持可见性...
  5. vue(el-button的五种类型,三种css格式)
  6. Python画板画图之美
  7. 连接mysql报错有乱码_连接mysql服务器报错时,出现乱码
  8. php配置文件加载顺序,php extension 加载顺序问题
  9. history模式监听_面试题:VueRouter中的 hash 模式和 history 模式有什么区别
  10. 两相流计算中,如何用Tecplot提取水相断面平均物理量?