POJ - 1724:ROADS

POJ 1724 ROADS(深度搜索+剪枝优化) poj 1724 ROADS 题目描述 一个人打算从1城市到达n城市,他想尽快到达那里,但是他的资金短缺,求他能够负担得起的城市1到城市N 的最短路径。 输入 第一行包含整数K,0 <= K <= 10000,Bob可以在路上花费的最大硬币数。 第二行包含整数N,2 <= N <= 100,即城市总数。 第三行包含整数R,1 <= R <= 10000,道路总数... 阅读详情

N cities named with numbers 1 ... N are connected with one-way roads. Each road has two parameters associated with it : the road length and the toll that needs to be paid for the road (expressed in the number of coins). 
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

The first line of the input contains the integer K, 0 <= K <= 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

The first and the only line of the output should contain the 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

题意:

N个城市,编号1到N。城市间有R条单向道路。 每条道路连接两个城市,有长度和过路费两个属性。 Bob只有K块钱,他想从城市1走到城市N。问最短共需要走多长的路。如果到不了N ,输出-1
2<=N<=100

0<=K<=10000

1<=R<=10000                                                       

每条路的长度 L, 1 <= L <= 100

每条路的过路费T , 0 <= T <= 100

先说一下时间超限的做法 !!!!!!

// -----------------  该种解法时间超限  ------------------
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int K,N,R;//钱,城市,道路
struct Road {//城市
    int d,L,t;//终点、长度、过路费
};
vector< vector<Road> > G(110);//创建城市集:注意这里只能用括号而不能用中括号
int minLen;
int totalLen;//距离
int totalCost;//花费
int visited[110];//记忆数组

void dfs(int s)
{
    if(s==N){ // 出口:已到城市N
        minLen = min(minLen,totalLen);//更新最小距离
        return;//返回函数
    }
    for(int i = 0;i<G[s].size();++i){ //遍历所有城市所有出去的路
        Road r = G[s][i];//取出当前道路
        if(totalCost + r.t > K)//花费超限
            continue;//此路不行,换下条路
        if(!visited[r.d]){//该路的终点没有到达过
            totalLen += r.L;//更新距离
            totalCost += r.t;//更新花费
            visited[r.d] = 1;//将终点设为已访问过
            dfs(r.d);//在终点的基础上进行深搜
            visited[r.d] = 0;//回溯
            totalLen -= r.L;
            totalCost -= r.t;
        }
    }
}

int main()
{
    scanf("%d%d%d",&K,&N,&R);
    for(int i = 0;i<R;++i)
    {
        int s;//充当起点
        Road r;//创建节点
        scanf("%d%d%d%d",&s,&r.d,&r.L,&r.t);
        if(s != r.d){//起点和终点不重复
            G[s].push_back(r);//相当于使用邻接表来存储图
        }
    }
    memset(visited,0,sizeof(visited));//初始化
    totalLen = 0;//每次情况的总长度
    minLen = 1 << 30;//最短距离
    totalCost = 0;//花费
    visited[1] = 1;//将第一座城市设为已访问
    dfs(1);//从第一座城市来对图进行深搜
    if(minLen < (1<<30)) //可以到达
        printf("%d\n",minLen);
    else //无法到达
        printf("-1");
    return 0;
}

 结果       

 解题思路:

从城市 1开始深度优先遍历整个图,找到所有能到达 N 的走法, 选一个最优的。

最优性剪枝:

1) 如果当前已经找到的最优路径长度为L ,那么在继续搜索的过程中,总长度已经大 于等于L的走法,就可以直接放弃,不用走到底了

另一种通用的最优性剪枝思想 ---保存中间计算结果用于最优性剪枝:

2) 如果到达某个状态A时,发现前面曾经也到达过A,且前面那次到达A所花代价更 少,则剪枝。这要求保存到达状态A的到目前为止的最少代价。

用midL[k][m] 表示:走到城市k时总过路费为m的条件下,最优路径的长度。若在后 续的搜索中,再次走到k时,如果总路费恰好为m,且此时的路径长度已经超过 midL[k][m],则不必再走下去了。
 

// -----------------  进行了剪枝解决了时间超限问题  ------------------
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int K,N,R;//钱,城市,道路
struct Road {//城市
    int d,L,t;//终点、长度、过路费
};
vector< vector<Road> > G(110);//创建城市集:注意这里只能用括号而不能用中括号
int minL[110][10010];//minL[i][j]表示从1到i点的,花销为j的最短路的长度
int minLen;
int totalLen;//距离
int totalCost;//花费
int visited[110];//记忆数组

void dfs(int s)
{
    if(s==N){ // 出口:已到城市N
        minLen = min(minLen,totalLen);//更新最小距离
        return;//返回函数
    }
    for(int i = 0;i<G[s].size();++i){ //遍历所有城市所有出去的路
        Road r = G[s][i];//取出当前道路
        if(totalCost + r.t > K)//花费超限:可行性剪枝
            continue;//此路不行,换下条路
        if(!visited[r.d]){//该路的终点没有到达过
            if (totalLen + r.L >= minLen) //最优性剪枝
                continue;
            if(totalLen + r.L >= minL[r.d][totalCost + r.t])//可行性剪枝
                continue;
            minL[r.d][totalCost+r.t] = totalLen + r.L;
            totalLen += r.L;//更新距离
            totalCost += r.t;//更新花费
            visited[r.d] = 1;//将终点设为已访问过
            dfs(r.d);//在终点的基础上进行深搜
            visited[r.d] = 0;//回溯
            totalLen -= r.L;
            totalCost -= r.t;
        }
    }
}

int main()
{
    scanf("%d%d%d",&K,&N,&R);
    for(int i = 0;i<R;++i)
    {
        int s;//充当起点
        Road r;//创建节点
        scanf("%d%d%d%d",&s,&r.d,&r.L,&r.t);
        if(s != r.d){//起点和终点不重复
            G[s].push_back(r);//相当于使用邻接表来存储图
        }
    }
    memset(visited,0,sizeof(visited));//初始化为0
    memset(minL,0x3f,sizeof(minL));//初始化为无穷大
    totalLen = 0;//每次情况的总长度
    minLen = 1 << 30;//最短距离
    totalCost = 0;//花费
    visited[1] = 1;//将第一座城市设为已访问
    dfs(1);//从第一座城市来对图进行深搜
    if(minLen < (1<<30)) //可以到达
        printf("%d\n",minLen);
    else //无法到达
        printf("-1");
    return 0;
}

 

QMT量化交易桥接方案深度对比:从MiniQMT淘汰说起 量化交易系统中的API桥接,本质是解决本地终端与底层交易引擎之间的通信瓶颈。其核心原理在于绕过GUI封装、直连确定性执行层,从而获得低延迟、高可靠、可监控的指令通路。技术价值体现在策略实盘一致性提升、毫秒级响应保障及运维可控性增强。典型应用场景包括打板策略、T+0套利、高频网格等对时效与稳定性双敏感的自动化交易。本文聚焦国金证券QMT专业版生态,系统剖析DLL注入、HTTP反向代理、IPC共享内存与官方HTTP API四大桥接路径的性能边界、合规风险与工程落地成本,尤其深入解析qmt终端 client is 阅读详情

相关推荐

MaxKey+JeecgBoot单点登录实战:手把手教你从零配置到账户同步

本文提供MaxKey与JeecgBoot单点登录(SSO)的实战整合指南。详细讲解从MaxKey应用注册、JeecgBoot前后端改造,到最终实现账户同步的完整步骤,重点解决Shiro配置、令牌交换等关键问题,帮助企业构建统一、可扩展的身份管理体系。

weixin_29258297的博客 541

POJ 1724(深度优先搜索)

题目来源:https://vjudge.net/problem/POJ-1724分析:从城市1开始深度优先遍历整个图,找到所有能走到N的走法,选一个最优的。如果当前已找到最优路径走法为L,那么在继续搜索的过程中,总长度大于L,则放弃该条路。minL[i][j]表示走到i时花费j的最短长度,如果走到i时总花费大于min[i][j],则不必走下去了。代码:#include &lt;stdio.h&gt...

小王同学 774

文档多模态识别工具对比:MinerU、PaddleOCR、Marker

本文对比了三款文档多模态识别工具:MinerU、PaddleOCR和Marker。MinerU专注于中文文档的端到端解析,支持复杂元素提取和结构化输出,适合中文论文和教材解析。PaddleOCR是通用OCR工具包,支持多语言和全流程任务,适用于发票、车牌等图像OCR。Marker则注重多语言支持和轻量化部署,适合英文论文和技术文档的快速转换。三者在核心技术、中文优化、表格处理、输出格式、部署复杂度和适用语言等方面各有优劣。选型建议根据具体需求:MinerU适合高精度中文解析,PaddleOCR适合定制化OC

朴拙科技的博客 4744

POJ1724---ROADS (最短路变形(邻接表+优先队列))

【题目来源】:https://vjudge.net/problem/POJ-1724 【题意】 给出旅游经费k,每一条路都要花去一定的经费,在保证能够从点1到点n的情况下,求最短路。 【思路】 这是我的最短路专题里最后一道题了。总体感觉这几天做的还行,学到了不少东西。有苦有乐。 第一次这么在最短路里用优先队列,然后,恍然大悟还可以这么写。 这道题前提保证能够到达n点,并且还要是最短路,那

Crazy 474

在macOS上使用GitHub的超详细指南

GitHub:免费的远程仓库,可用来托管自己的开源项目。它利用了Git强大的克隆和分支功能,让我们参与别人的开源项目和让别人参与自己的开源项目变得简单高效。

Mars的博客 3391

从零到一:海外短剧成品系统源码搭建流程详解及APP+H5交付服务

在当今全球化的数字娱乐浪潮中,海外短剧市场以其独特的文化魅力和广阔的受众基础,正逐渐成为内容创作者与平台运营者争相布局的新蓝海。我为了紧跟时代的发展我翻看了大量的文章,偶然间看到了一篇文章点进去发现他们是专业做短剧开发的,总结下来在这篇文章里分享给大家。

liangyill_的博客 907

POJ 1724 (分层图最短路)

### POJ 1724题目链接 ### 题目大意: 给你 N个点 ,M条有向路,走每条路需要花费 C元,这段路的长度为 L 。 给你 K元,问你能否从 1走到 N 点且花费不超过 K元。如果可以,输出出最短距离,否则输出 -1 。 显然分层图最短路,这里dist[i][j]表示从 1到i点 且 所剩钱数为j时的最短路,然后跑一遍dijk...

diefen9380的博客 351

天龙八部TLBB系列 - 网单用数据库修改为其他门派

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派

空名先生 9430

poj 1724(优先队列+Dij)

题意:k点点数,n个点,m条边,每条边有权值以及通过时会消耗的点数,求在消耗点数不超过k点的情况下,从1到n的最短路径。        分析:显然是一个最短路的变形,而且是一种常见的模型。最短路本身是一个求解最优解的问题,在这里加多了一个限制条件,就是点数,所以变为“在一定的限制条件下求解一个最优化问题”的模型,这样的模型,有一个大致的套路:在满足限制条件后,再进行更新。     求解方法有很

流沙-岁月 872

【ODX介绍】-4.2-UDS诊断$27服务在ODX-D诊断描述文件中如何描述

共25页精讲:附ODX-D XML:UDS $27 Security服务0x61和0x62 Sub-Function,其它Sub-Function可参照其格式。 目录 1 ODX-D描述一个UDS $27 Security服务Sub-Function的结构 2 标签DIAG-SERVICE描述的内容 2.1 举例:DIAG-SERVICE的XML描述 3 标签REQUEST描述的内容 3.1 举例:REQUEST的XML描述 4 标签POS-RESPONSE描述的内容 4.1 举例:PO..

「汽车电子助手」的博客 1121

11、RK3566/3568 Android11切割屏幕 长条屏 显示

在使用 RK3566 平台进行 Android 11 开发时,遇到切割屏(长条屏)显示画面不全。本文将详细介绍如何配置,以及如何修改 HWComposer 来调整显示区域,解决图像缩放问题。我这边屏幕是lvds接口的,分辨率1920 1080实际的屏物理尺寸是1920x463。

qq_39451352的博客 252

poj1724(带限制的最短路)

题意:一个人要从1点到N点,有m条边可以走,走每条边要花一些钱,这个人只有k的钱,问花的钱不多于K且能到N的最短路。 spfa解决最短路,不过dist数组要加一维,dist【i】【j】表示从1走到了i花了j钱的最短路。 感觉这时候就是个bfs #include #include #include #include using namespace std; int n,k; struct no

constbh的博客 1843

【HALCON工业视觉应用探索】02. C# + Halcon铸件毛刺机器人打磨引导:点云处理从实验室到工业现场的全流程落地

摘要:铸件毛刺的自动化打磨是机械制造领域的重要难题,其随机性(高度0.1-3mm)和复杂工况导致人工打磨效率低(3分钟/件)、工伤率高。本文基于Halcon 24.11与.NET 6,构建了一套点云处理方案:通过线激光扫描仪获取三维点云,经预处理、毛刺检测、路径规划三大模块,引导机器人完成打磨。虚拟实验测试显示,对高度>1mm的毛刺检出率达100%,定位误差±0.08mm,但工业现场受油污、粉尘影响,性能降至检出率68-75%、处理时间>45秒。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1128

深搜:POJ1724:ROADS

深搜:POJ1724:ROADS 问题描述 描述 N cities named with numbers 1 … N are connected with one-way roads. Each road has two parameters associated with it : the road length and the toll that needs to be paid for t...

housz77的博客 189

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

poj 1724 Roads dfs Java

poj 1724 Roads 这题主要是学习如何剪枝,不只是最优性剪枝(当当前的路径长度大于已经求得的最大路径长度就回到上一步),还学习保留中间计算结果剪枝。 minLen [ i ] [ j ] 表示到达城市 i 花费 j 的最小路径长度,并在搜索过程中不断的对该中间结果进行更新。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.St

weixin_46621409的博客 427

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ROADS poj-1724

题目链接:1724 -- ROADS 题面: 题意:有r条单向道路,每条路有一个过路费和时间,我只有k元,问走到n的最少时间 思路:用链式前向星存图,然后搜索遍历一遍。 两个剪枝: 1.如果花费超过k了直接返回。 2.如果走到某个点的时间超过最短时间就返回 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include &lt.

m0_55682843的博客 1483

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

POJ-1724 ROADS

POJ-1724 ROADS 题目链接:POJ-1724 题目大意:给定起点终点和路程长度和花费 问你从1到n点在自己钱够的情况下的最短路径 解题思路:最一开始直接暴力的dfs来着 后来是直接就RE了 估计是爆栈了 之后改成用优先队列做,同一起点终点 道路长度从小到大排列 花费也从小到大排 然后用到了重载运算符 代码块: #include<iostream> #include<...

鱼头的水题之路 403

poj1724ROADS

http://poj.org/problem?id=1724 解题思路: 从城市 1开始深度优先遍历整个图,找到所有能到达 N 的走法 , 选一个最优的。 优化: 1) 如果当前已经找到的最优路径长度为L ,那么在继续搜索的过程中,总长度已经大 于L的走法,就可以直接放弃,不用走到底了 2) 用midL[k][m] 表示:走到城市k时总过路费为m的条件下,最优路径的长度。若在 后续的

ViolentLittleAngel的博客 446

[POJ1724]ROADS

[POJ1724]ROADS 1 #include<iostream> 2 #include<limits.h> 3 #include<stdio.h> 4 #include<vector> 5 #include<string.h> 6 using namespace std; 7 inl...

weixin_30764137的博客 92

POJ1724-ROADS

http://poj.org/problem?id=1724 #include<iostream> #include<queue> #define INF 1000000000 #define MAXR 105 using namespace std; int E,N,M,s,d,l,t,dis[MAXR],i; struct Node { ...

weixin_30412013的博客 128

POJ-1724-ROADS

POJ-1724-ROADS http://poj.org/problem?id=1724 单向边最短路问题,但是每条边都有一个费用,要求你的最短路方案的总的花费不能超过限制,深搜即可 #include #include #include #define M 10000 #define INF 99999999 struct edge { int v; int len; int tol

comeace的程序人生 285

poj 1724 ROADS

传送门:http://poj.org/problem?id=1724 注意有重边! ①Dijsktra+优先队列(16ms): #include #include #include #include #include using namespace std; const int INF=0x3f3f3f3f; const int maxn=10010; int T,n,k,r,e; i

To be excellent! 279

[POJ 1724]ROADS[SPFA][DFS剪枝]

题目链接:[POJ 1724]ROADS[SPFA][DFS剪枝] 题意分析: 求从点1到点N费用不超过K的最短路。 解题思路: 用spfa根据最小花费,跑出一组距离作为起始答案,如果该答案费用大于K,那么就无解。 确认有解后,我们从点1开始DFS,用花费和之前算的距离作为剪枝。 个人感受: 差点弃疗了。1A也是蛮爽的。 具体代码如下: #include #include #

闲停 687

POJ-1724 Roads + Python (DFS)

原题链接:1724 -- ROADS 参考资料:王子解救公主力扣 174. 地下城游戏 DFS + Python_xxdragon126的博客-优快云博客 一问题描述: 从起始城市1到终止城市N,要求在路费ALL可控的情况下路程最短,返回最短路程。详见原题链接。 结题思路: ## 使用DFS: # 1 首先,将数据转化为嵌套的字典,以便于查找当前城市所能到达的所有城市,以及到达各城市所需的路径和路径。 # 2 然后,从起始点1开始,查找其邻接点城市,将每个城市作为初始点,进行dfs搜索 .

xxdragon126的博客 2536

poj-1724 ROADS

最短路 附加费用限制

a free man 636

poj1724——ROADS

题目:Bob想从城市1去城市N,这些城市间有一些长度和花费不同的路共R条,两个城市之间可以有很多路(单向路),Bob只有K枚硬币,问他的最短路径 输入:K(0            N(2            R(1            第i条路的描述(共R行,S D L T分别代表起点、终点、路长( 1 输出:最短路径长度(如果不存在输出-1) 分析:dfs+剪枝/bfs

tzyshiwolaogongya的博客 308
上一篇: OpenJ_Bailian - 4115 :鸣人和佐助
下一篇: OpenJ_Bailian - 1077 :Eight (八数码)
朱事顺利、
博客等级 码龄9年 25粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱事顺利、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值