POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)
题目链接:
https://cn.vjudge.net/problem/POJ-1724
Bob and Alice used to live in the city 1. After noticing that
Alice was cheating in the card game they liked to play, Bob broke up
with her and decided to move away - to the city N. He wants to get there
as quickly as possible, but he is short on cash.
We want to help Bob to find
the shortest path from the city 1 to the city N
that he can afford with the amount of money he has.
Input
<= 10000, maximum number of coins that Bob can spend on his way.
The second line contains the integer N, 2 <= N <= 100, the total number of cities.
The third line contains the integer R, 1 <= R <= 10000, the total number of roads.
Each of the following R lines describes one road by specifying integers S, D, L and T separated by single blank characters :
- S is the source city, 1 <= S <= N
- D is the destination city, 1 <= D <= N
- L is the road length, 1 <= L <= 100
- T is the toll (expressed in the number of coins), 0 <= T <=100
Notice that different roads may have the same source and destination cities.
Output
total length of the shortest path from the city 1 to the city N whose
total toll is less than or equal K coins.
If such path does not exist, only number -1 should be written to the output.
Sample Input
5
6
7
1 2 2 3
2 4 3 3
3 4 2 4
1 3 4 1
4 6 2 1
3 5 2 0
5 4 3 2
Sample Output
11
/*
题意描述
输入总钱数k,顶点数n,边数m
每一条边s到d长度是l,花费是t
可能有重边
问在不超过k的前提下,从1到n的最短路径是多少,如果不存在这样的最短路输出-1. 解题思路
使用用优先队列的广搜,保证每次弹出的结点是距离最短,而且花费相对小的,搜索的时候不用像矩阵中那样标记哪个结点用过了,因为使用
的是每个结点的邻接边,标记了可能就不能用这条边了,故直接搜索。还需注意的是一定要是弹出的结点是终点再结束,如果在搜索的时候遇
到直接结束,可能这条路径不是最短的,但是从优先队列里第一个弹出的一定是最短的。
*/
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
const int maxn = ;
const int INF = 0x3f3f3f3f;
using namespace std; struct Edge{
int from, to, dist, pay;
Edge(int s, int d, int l, int t) : from(s), to(d), dist(l), pay(t) { };
}; struct HeapNode {
int u, d, c;
bool operator < (const HeapNode& a) const {
if(d == a.d){
return c > a.c;
}
return d > a.d;
}
}; struct BFS {
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn]; void init(int n) {
this->n = n;
for(int i = ; i < n; i++)
G[i].clear();
edges.clear();
} void AddEdge(int from, int to, int dist, int pay) {
edges.push_back(Edge(from, to, dist, pay));
m = edges.size();
G[from].push_back(m - );
} int bfs(int k, int s) {
memset(done, , sizeof(done));
done[s] = ; priority_queue<HeapNode> q;
q.push((HeapNode){s, , });
while(!q.empty()) {
HeapNode x = q.top();
q.pop();
int u = x.u;
if(u == n - )
return x.d;
for(int i = ; i < G[u].size(); i++) {
Edge e = edges[G[u][i]];
if(k >= e.pay + x.c)
q.push((HeapNode){e.to, x.d+e.dist, e.pay + x.c});
}
}
return -;
}
}; struct BFS solve;
int main()
{
int k, n, m, s, d, l, t;
while(scanf("%d", &k) != EOF) {
scanf("%d%d", &n, &m); solve.init(n);
for(int i = ; i <= m; i++) {
scanf("%d%d%d%d",&s, &d, &l, &t);
s--;d--;
solve.AddEdge(s, d, l, t);//先--再使用
} printf("%d\n", solve.bfs(k,));
}
return ;
}
POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)的更多相关文章
- 深搜+剪枝 POJ 1724 ROADS
POJ 1724 ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12766 Accepted: 4722 D ...
- poj 1724 ROADS 解题报告
题目链接:http://poj.org/problem?id=1724 题目意思:给出一个含有N个点(编号从1~N).R条边的有向图.Bob 有 K 那么多的金钱,需要找一条从顶点1到顶点N的路径(每 ...
- poj 1724:ROADS(DFS + 剪枝)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10777 Accepted: 3961 Descriptio ...
- POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化
昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...
- POJ 1724 Roads
题意:有R条路,每条路都有一定的路长和花费,问在总的花费小于一定的值的情况下,从1到N的最短路程 注意:这里两点之间单向边,且可能存在很多条路,所以只能用邻接表存储.思路:用dijks ...
- 用邻接表实现DFS和BFS
#include <stdio.h> #include <stdlib.h> #define MAXVERTEX 10 typedef char VertexType; //顶 ...
- POJ 1724 ROADS(BFS+优先队列)
题目链接 题意 : 求从1城市到n城市的最短路.但是每条路有两个属性,一个是路长,一个是花费.要求在花费为K内,找到最短路. 思路 :这个题好像有很多种做法,我用了BFS+优先队列.崔老师真是千年不变 ...
- poj 1724 ROADS 很水的dfs
题意:给你N个城市和M条路和K块钱,每条路有话费,问你从1走到N的在K块钱内所能走的最短距离是多少 链接:http://poj.org/problem?id=1724 直接dfs搜一遍就是 代码: # ...
- POJ 1724 ROADS(bfs最短路)
n个点m条边的有向图,每条边有距离跟花费两个参数,求1->n花费在K以内的最短路. 直接优先队列bfs暴力搞就行了,100*10000个状态而已.节点扩充的时候,dp[i][j]表示到达第i点花 ...
随机推荐
- javascript day 02
js-day02 1.数据类型转换2.函数3.分支结构*******************************1.数据类型转换 数据类型:number,string,boolean,null,u ...
- qhfl-5 redis 简单操作
Redis Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis有以下特点: -- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可 ...
- maven学习三
做项目时使用maven构建项目已经是现在的流行做法了.那么maven的作用是什么呢?maven中的几个常用的命令都有什么用?下面我们来看一下. maven最大的作用就是用于对项目中jar包依赖的统一管 ...
- winform改变启动界面
我们知道,有时做个小项目什么的,一般从登录开始,再到主页,再到其他业务,如果做到其他页面功能,调试时还要从登录页面一个个点进去,明显的降低开发进度. 这时,我们可以直接将目标界面改为启动页面即可. u ...
- InternalResourceViewResolver视图解析器(转)
转载地址:https://www.cnblogs.com/liruiloveparents/p/5054605.html springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就 ...
- git代码同步服务器代码需要注意的问题
魔鬼藏在细节之中,git代码同步服务器代码需要注意的问题 1. 全文件夹覆盖 git pull 当前文件夹 2. 覆盖前做代码备份 mv origin origin_20190404_bak
- 带权单源最短路[稀疏图](Dijkstra)
因为是稀疏图,所以应当选择邻接表来存储 构造一个邻接表 这只是我的构造方法,有很多种更好的构造方法,大家可以自己去构造 typedef int vertex; typedef int WeightTy ...
- Visual Studio 代码片段
管理界面 打开 工具 >> 代码片段管理器 界面 使用步骤 选择对应语言. 选择一个片段的文件夹. 打开该文件夹的位置. 复制任意一个片段. 对复制出来的片段进行修改.(具体修改内容见例子 ...
- 响应式网站设计(Responsive Web design)
页面的设计与开发应当根据用户行为以及设备环境(系统平台.屏幕尺寸.屏幕定向等)进行相应的响应和调整.具体的实践方式由多方面组成,包括弹性网格和布局.图片.CSS media query的使用等.无论用 ...
- 杂七杂八的JavaScript
一.input 焦点定位 1.定位input:(this.$refs.searchInput as HTMLInputElement).focus(); 2.定位search,根据css选择器: ...