题目大意:
有N个城市,编号1-N
有R条路,每条路(单向)的起点为Si,终点为Di,长度为Li,如果要走这条路需要花Ti的钱
现在你只有K元钱,求在不超支的前提下,从1走到N需要的最短距离

这里总是希望路程尽可能的短,那么利用dijkstra的方法来解决问题,总是先扩展距离近的点,这样能更快的找到终点的最短路

节点的扩展满足二维的情况,只要路程和费用两个限制条件中的其中一个满足情况那么当前节点便要扩展

用cost[i],dis[i]记录在i节点所能达到的最优状态,只有某个情况left>cost[v] && d<dis[i] 那么两维情况都满足条件,就可以更新cost[],dis[]

但是这里要注意的是 dis[n]并不一定是最终答案,因为可能路程最短并不一定花费最少,那么就不会去更新这两个数组,我们只要把第一个带n的从

优先队列中跳出的点的长度作为答案即可,因为是优先队列,所以先弹出的n的点,一定是距离最短的

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
#define N 10010
#define MAXN 200010
#define ll long long
const int INF = 0x3f3f3f3f; int k,n,m;
int dis[N] , cost[N];
int first[N] , kk; struct Edge{
int x , y , next , d , c;
Edge(int x= , int y= , int next= , int d= , int c=):x(x),y(y),next(next),d(d),c(c){}
}e[N<<]; struct City{
int id , d , money;
City(int id , int d= , int money=):id(id),d(d),money(money){}
bool operator<(const City &m) const {
if(d == m.d) return money<m.money;
else return d>m.d;
}
}; priority_queue<City> q; void add_edge(int x,int y,int d,int c)
{
e[kk] = Edge(x,y,first[x],d,c);
first[x]=kk++;
} int dijkstra()
{
while(!q.empty()) q.pop();
memset(dis , 0x3f , sizeof(dis));
memset(cost , - , sizeof(cost));
q.push(City( , , k));
dis[] = , cost[] = k;
while(!q.empty())
{
City u = q.top();
q.pop();
if(u.id == n) return u.d;
if(u.d>dis[u.id] && u.money<cost[u.id]) continue;
for(int i = first[u.id] ; ~i ; i=e[i].next){
int v = e[i].y;
if(u.money-e[i].c>= && (u.money-e[i].c>cost[v] || u.d+e[i].d<dis[v])){
int left = u.money-e[i].c;
int distance = u.d+e[i].d;
q.push(City(v,distance,left));
if(left>cost[v] && distance<dis[v]){
cost[v] = left;
dis[v] = distance;
}
}
}
}
return INF;
} int main()
{
// freopen("a.in" , "r" , stdin);
while(~scanf("%d%d%d", &k , &n , &m))
{
kk=;
memset(first , - , sizeof(first));
for(int i= ; i<m ; i++){
int x,y,d,c;
scanf("%d%d%d%d" , &x , &y , &d , &c);
add_edge(x , y , d , c);
}
int ans = dijkstra();
if(ans == INF) puts("-1");
else printf("%d\n" , ans);
}
return ;
}

最新文章

  1. 安装CentOS7重启后提示License information
  2. KDE、GNOME 和 XFCE 桌面比较
  3. window 内核详尽分析
  4. doTjs源码研究笔记
  5. Javascript 简单学习
  6. Matrix multiplication hdu4920
  7. I.MX6 U-boot GPIO hacking
  8. Python3 正则表达式
  9. Swift - whose view is not in the window hierarchy 问题解决方法
  10. Intellij IDEA更新SVN没有提示语
  11. .net的retrofit--WebApiClient库
  12. React设计思想
  13. vue-cli@2的原理解析
  14. HttpServerProvider实现http服务接口(一)
  15. stm32 r8025
  16. sshd_config优化
  17. Centos之文件搜索命令find
  18. [webpack] Webpack &#21035;&#21517;
  19. Dubbo问题处理集合
  20. python打印对象的所有可操作内容

热门文章

  1. Java中“==”的使用,以及“==”和equal的比较
  2. hihocoder1736 最大的K-偏差排列
  3. 在vscode中显示空格和tab符号
  4. NestedScrollView嵌套RecycleView发生的小问题
  5. Ajax的项目搭建
  6. Verilog设计中的锁存器
  7. linux php扩展安装gettext
  8. java实现汉诺塔算法
  9. Java JDK装配置
  10. H3C S5024P交换机互连实验