POJ 1724 (分层图最短路)
题目大意:
给你 N 个点 ,M 条有向路,走每条路需要花费 C 元,这段路的长度为 L 。
给你 K 元,问你能否从 1 走到 N 点且花费不超过 K 元。如果可以,输出出最短距离,否则输出 -1 。
显然分层图最短路,这里 dist[i][j] 表示从 1 到 i 点 且 所剩钱数为 j 时的最短路,然后跑一遍 dijkstra 即可。
PS:在优先队列先到达 N 点的即为答案,可以直接返回,不需要等队列走完再 O(N)找最小值,时间会很快(这里还是遍历了一遍 = =)
代码如下:
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#define inf 0x3f3f3f3f
#define maxn 308
using namespace std;
int K,N,M,cnt;
int head[maxn],ans;
bool vis[maxn][];
int dist[maxn][];
struct Edge
{
int to;
int val;
int m;
int next;
}edge[maxn*maxn];
struct Node
{
int x;
int k;
int val;
Node(){};
Node(int _x,int _k,int _val){
x=_x,k=_k,val=_val;
}
bool operator < (const Node a) const{
return val>a.val;
}
};
inline void add(int u,int v,int val,int m)
{
edge[++cnt].to=v;
edge[cnt].val=val;
edge[cnt].m=m;
edge[cnt].next=head[u];
head[u]=cnt;
return;
}
void dijkstra()
{
priority_queue<Node> q;
while(!q.empty()) q.pop();
for(int i=;i<=N;i++){
for(int j=;j<=K;j++){
dist[i][j]=inf;
}
}
q.push(Node(,K,));
dist[][K]=;
while(!q.empty())
{
int u=q.top().x,k=q.top().k;
q.pop(); // 这里可以直接 if( u == N) ans = q.top().val ,即为答案
if(vis[u][k]) continue;
vis[u][k]=true;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(k>=edge[i].m){
if(dist[v][k-edge[i].m]>dist[u][k]+edge[i].val){
dist[v][k-edge[i].m]=dist[u][k]+edge[i].val;
q.push(Node(v,k-edge[i].m,dist[v][k-edge[i].m]));
}
}
}
}
return;
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
scanf("%d%d%d",&K,&N,&M);
int A,B,C,D;
while(M--)
{
scanf("%d%d%d%d",&A,&B,&C,&D);
add(A,B,C,D);
}
ans=inf;
dijkstra();
for(int i=;i<=K;i++){
ans=min(ans,dist[N][i]);
}
if(ans==inf) printf("-1\n");
else printf("%d\n",ans );
}
POJ 1724 (分层图最短路)的更多相关文章
- poj3635Full Tank?[分层图最短路]
Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7248 Accepted: 2338 Descri ...
- HDU 5669 线段树优化建图+分层图最短路
用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...
- BZOJ 2763 分层图最短路
突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...
- 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)
[题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...
- 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)
[题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...
- BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路
BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路 Description “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切, ...
- BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路
BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...
- Nowcoder contest 370H Rinne Loves Dynamic Graph【分层图最短路】
<题目链接> 题目大意:Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图.当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动. ...
- ACM-ICPC 2018 南京赛区网络预赛 L 【分层图最短路】
<题目链接> 题目大意: 有N个城市,这些城市之间有M条有向边,每条边有权值,能够选择K条边 边权置为0,求1到N的最短距离. 解题分析: 分层图最短路模板题,将该图看成 K+1 层图,然 ...
随机推荐
- go 语言学习图解
- 使用pip安装python库的几种方式
操作系统 : CentOS7.5.1804_x64 Python 版本 : 3.6.8 1.使用pip在线安装 1.1 安装单个package 格式如下: pip install SomePackag ...
- error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in
问题: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_ ...
- 使用过Redis,我竟然还不知道Rdb
目录 使用过Redis,那就先说说使用过那些场景吧 Rdb文件是什么,它是干什么的 分析工具 小结 联想 推荐阅读 使用过Redis,那就先说说使用过那些场景吧 字符串缓存 //举例 $redis-& ...
- Jedis & spring-data-redis
当我们了解了redis的五大数据类型,手动去敲一敲每个数据类型对应的命令,无论是再来看jedis,还是spring-data-redis都是很轻松的,他们提供的API都是基于原生的redis命令,可读 ...
- R3环申请内存时页面保护与_MMVAD_FLAGS.Protection位的对应关系
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 技术学习来源:火哥(QQ:471194425) R3环申请内存时页 ...
- javaWeb核心技术第五篇之jQuery
- 概述 - jQuery是一个优秀的javascript框架(js类库),兼容css3和各大浏览器,提供dom,events,animate,ajax等简易的操作.并且jQuery有非常丰富的插件, ...
- 【JS简洁之道小技巧】第一期 扁平化数组
介绍两种方法,一是ES6的flat,简单粗暴.二是递归,也不麻烦. flat ES6自带了flat方法,用于使一个嵌套的数组扁平化,默认展开一个嵌套层.flat方法接收一个数字类型参数,参数值即嵌套层 ...
- 图像几何变换之平移(Matlab)
G=imread('aini555.jpg'); A=rgb2gray(G); se=translate(strel(),[,]); B=imdilate(A,se); figure; subplot ...
- ABP入门教程10 - 展示层实现增删改查-控制器
点这里进入ABP入门教程目录 创建控制器 在展示层(即JD.CRS.Web.Mvc)的Controllers下新建一个控制器CourseController.cs using Abp.Applicat ...