POJ 1724 二维费用最短路
题目大意:
有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 ;
}
POJ 1724 二维费用最短路的更多相关文章
- HDU 3496 (二维费用的01背包) Watch The Movie
多多想看N个动画片,她对这些动画片有不同喜欢程度,而且播放时长也不同 她的舅舅只能给她买其中M个(不多不少恰好M个),问在限定时间内观看动画片,她能得到的最大价值是多少 如果她不能在限定时间内看完买回 ...
- HDU 2159 二维费用背包问题
一个关于打怪升级的算法问题.. 题意:一个人在玩游戏老是要打怪升级,他愤怒了,现在,还差n经验升级,还有m的耐心度(为零就删游戏不玩了..),有m种怪,有一个最大的杀怪数s(杀超过m只也会删游戏的.. ...
- hdu2159二维费用背包
题目连接 背包九讲----二维费用背包 问题 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有一个可付出的最大值(背包容量).问怎样选择物 ...
- 2159 ACM 杭电 杀怪 二维费用的背包+完全背包问题
题意:已知经验值,保留的忍耐度,怪的种数和最多的杀怪数.求进入下一级的最优方案. 思路:用二维费用的背包+完全背包问题 (顺序循环)方法求解 什么是二维费用的背包问题? 问题: 二维费用的背包问题是指 ...
- 洛谷 P1507 NASA的食物计划 【二维费用背包】 || 【DFS】
题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...
- Regionals 2014 >> Asia - Taichung 7003 - A Balance Game on Trees 树形DP + 二维费用背包
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 动态规划:HDU3496-Watch The Movie(二维费用的背包问题)
Watch The Movie Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- 动态规划:HDU2159-FATE(二维费用的背包问题)
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 洛谷 P1509 找啊找啊找GF(复习二维费用背包)
传送门 题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七夕这个日子,对于sq ...
随机推荐
- 分区表,磁盘概念和parted的使用
分区表,磁盘概念和parted的使用 登录陌生系统首先要做的事: 个人认为,首先得知道Linux版本的什么:cat /etc/issue df:查看磁盘的分区和数据的分配情况,类型(NFS,ext4. ...
- Apache下禁止使用IP直接访问本站的配置方法
现在管的严啊,上面要求不能使用IP直接访问服务器,把apache配置做下调整就行了.方法如下: 打开apache的配置文件 # vi /usr/local/apache2/conf/extra/htt ...
- 虚方法virtual详解
虚方法virtual详解 从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在 ...
- 获取登陆信息 在created()方法中
// 获取登录信息 public async InitUser() { await sj.globalVar.Init(true); this.params.unitId = sj.globalVar ...
- VC++编译出错:LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
解决方法: 1.搜索C盘下的cvtres.exe,结果得到类似这样的列表: C:\Program Files\Microsoft Visual Studio 10.0\VC\bin C:\Window ...
- 混合开发之DCloud和Weex的集成及优缺点比较
记录此文时太忙,没时间整理上来.需要请私信,由于DCloud和Weex的版本及API更新过快,本次分享只是对某个版本处理.
- Qt中为QPushButton添加背景图片
有2种方式,一种是在代码中设置,另外一种是直接在Qt Creator中直接设置,下面是第二种 参考: http://doc.qt.io/qt-4.8/stylesheet-examples.html ...
- codevs 1043 方格取数 2000年NOIP全国联赛提高组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而 ...
- Graveyard LA3708
白书第一章例题4 思维. 先固定一点不动,假设最后一共N个点,那么编号为0,1,...N-1, 0不动,原来的n个点分别占据i/n*N的位置(记为pos),移动到pos四舍五入的位置即可. 证明一:有 ...
- 插入insert几种用法
1.insert ignore into 当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回.所以使用ignore请确保语句本身没有问题,否则也会被忽略掉.例如: INSERT I ...