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 层图,然 ...
随机推荐
- mysql学习体系
1. MySQL的安装和配置 -- 安装的步骤 -- 配置参数的设置 -- 全局变量量与会话变量量的定义及区别 -- 常⻅见参数有哪些,有何定义,影响范围是什什么 -- 如何查看参数的值 -- 配置⽂ ...
- poj 3061 Subsequence 二分 前缀和 双指针
地址 http://poj.org/problem?id=3061 解法1 使用双指针 由于序列是连续正数 使用l r 表示选择的子序列的起始 每当和小于要求的时候 我们向右侧扩展 增大序列和 每当和 ...
- PhpSpreadsheet的简单使用
由于PHPExcel已经不再维护,PhpSpreadsheet是PHPExcel的下一个版本.PhpSpreadsheet是一个用纯PHP编写的库,并引入了命名空间,PSR规范等.这里简单介绍下Php ...
- java中的this、super、static、final、abstract关键字的作用
this关键字的作用 1.this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题: 2.this可以调用成员变量,不能调用局部变量: 3.this也可以调用成员方法,但在普通方法中可 ...
- Java向上下转型中的陷阱{详细}
1: 多态 多态时继承下面的产物,之所以存在向上向下转型的目的,就是解决参数传递的不变形,体现面向接口编程的重要性, 1.1 方法的多态性 ①. 方法的重载:同一个方法名称可以根据参数的类型或 ...
- Gradle如何在任务失败后继续构建
如果我们运行Gradle构建并且其中一项任务失败,则整个构建将立即停止.因此,我们可以快速反馈构建状态.如果我们不想这样做,并且希望Gradle执行所有任务,即使某些任务可能失败了,我们也可以使用命令 ...
- [算法]实现strStr()
题目 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在 ...
- Python 條件式 Condition
除了重複使用Function,有時我們須檢查結果,依此判斷下個步驟該怎麼進行,如此就需要條件式 condition statement. if ... elif ... ese ( 或 if ... ...
- cesium 入门开发系列矢量瓦片加载展示(附源码下载)
前言 cesium 入门开发系列环境知识点了解:cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 源代 ...
- Java后端,最全知识点
你可能有所感悟.零散的资料读了很多,但是很难有提升.到处是干货,但是并没什么用,简单来说就是缺乏系统化.另外,噪音太多,雷同的框架一大把,我不至于全都要去学了吧. 这里,根据基础.Java基础.Jav ...