题目大意:

编号为1…N 的N个城市之间以单向路连接,每一条道路有两个参数:路的长度和通过这条路需付的费用。

Bob和Alice生活在城市1,但是当Bob发现了Alice玩扑克时欺骗他之后,他决定与她翻脸,离开城市1前往城市N。Bob想尽快到达城市N,但是他的钱不多。

希望你帮助Bob找到一条从城市1到城市N的总费用不超过Bob的承受能力的最短路径。

Input

输入的第一行是3个整数 K, N, R ,其中:

K:表示Bob能承受的最大费用,0 ≤ K ≤ 10000

N:表示城市的总数,2 ≤ N ≤ 100

R:表示道路的条数,1 ≤ R ≤ 10000

接下来的R行,每行用S  D  L  T(以空格隔开)表示一条道路:

S:表示道路的出发城市,1 ≤ S ≤ N

D:表示道路的目标城市,1 ≤ D ≤ N

L:表示道路的长度,1 ≤ L ≤ 100

T:表示通过这条道路需付的费用,0 ≤ T ≤ 100

Output

为每个测试用例输出一行结果:总费用小于或等于最大费用K的最短路径的长度。如果这样的路径不存在,则仅仅输出 -1 。

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

Hint

测试数据的图中可能有重边、有自环

原本天真地以为邻接表+DFS+简单剪枝就能过 结果还是TLE
之前看题解发现了一个 特殊的剪枝 用上就AC了
minlen[node][fee]数组记录1~ node 点在 fee 花费时的最短距离
假如搜索到 i 点而花费为 fe 时 le 超过了已记录到的 minlen[i][fe] 则可结束本次搜索

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;int s[10005],d[10005],l[10005],t[10005],flag[105];
int k,n,r,len,minlen[105][10005],first[105],nexti[10005];void DFS(int i,int le,int fe)
{if(fe>k || le>minlen[i][fe] || le>len) return;/// 用minlen数组记下 i 点在 fe 花费时的最短距离,若超过则可停止继续搜索了if(i==n){len=min(len,le);//printf("%d\n",len);return ;}else{if(le<minlen[i][fe]) /// 若存在更短的距离 则更新minlen的值for(int j=fe;j<=k;j++) minlen[i][j]=le;int in=first[i];while(in!=-1){if(!flag[d[in]]){flag[d[in]]=1; /// 避免自环情况DFS(d[in],le+l[in],fe+t[in]);flag[d[in]]=0;}in=nexti[in];} /// 邻接表遍历
}}
int main()
{while(~scanf("%d%d%d",&k,&n,&r)){memset(flag,0,sizeof(flag));for(int i=1;i<101;i++)for(int j=0;j<10001;j++)minlen[i][j]=200000;memset(first,-1,sizeof(first));for(int i=1;i<=r;i++){scanf("%d%d%d%d",&s[i],&d[i],&l[i],&t[i]);nexti[i]=first[s[i]];first[s[i]]=i;} /// 建邻接表 可避免重边引起的错误
flag[1]=1; len=INF;DFS(1,0,0);if(len==INF) printf("-1\n");else printf("%d\n",len);}return 0;
}

View Code

转载于:https://www.cnblogs.com/zquzjx/p/8605948.html

分道扬镳 /// 邻接表 DFS 剪枝 oj1332相关推荐

  1. ROADS POJ - 1724(最短路+邻接表+dfs)

    题意: N个城市,编号1到N.城市间有R条单向道路.有长度和过路费两个属性.Bob只有K块钱,他想从城市1走到城市N.问最短共需要走多长的路.如果到不了N,输出-1. 题目: N cities nam ...

  2. 用邻接表dfs和bfs图

    dfs bfs 树是一种特殊的图,与图的存储方式相同. 对于无向图中的边ab,存储两条有向边a->b, b->a. 因此我们可以只考虑有向图的存储. (1) 邻接矩阵:g[a][b] 存储 ...

  3. 魔法宝石(邻接表+dfs更新)

    魔法宝石 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submissi ...

  4. AcWing 3465. 病毒朔源 (邻接表DFS 详解)

    来源:CCCC天梯赛L2-038 病毒容易发生变异. 某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化. 现给定一些病毒之间的变异关系,要求你找 ...

  5. PAT甲级1004 Counting Leaves (30分):[C++题解]树、邻接表存储树、dfs遍历树

    文章目录 题目分析 题目链接 题目分析 题意重述:一棵树,求每一层的叶子节点数目. 分析 构造树,使用邻接表来存(相当于存储有向图). 需要一个头结点数组h[N],然后每个头节点往外形成一个单链表e[ ...

  6. 分道扬镳(DFS+剪枝+邻接表)

    题目: Time Limit: 300ms Description 编号为1-N 的N个城市之间以单向路连接,每一条道路有两个参数:路的长度和通过这条路需付的费用. Bob和Alice生活在城市1,但 ...

  7. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  8. PAT甲级1053 Path of Equal Weight (30分) :[C++题解]dfs求树的路径长度、邻接表

    文章目录 题目分析 题目链接 题目分析 输入样例: 20 9 24 10 2 4 3 5 10 2 18 9 7 2 2 1 3 12 1 8 6 2 2 00 4 01 02 03 04 02 1 ...

  9. 图的遍历DFS与BFS(邻接表)

    #include "stdafx.h" #include <iostream> #include <fstream> #include <queue& ...

最新文章

  1. java开源游戏下载安装_开源java扫雷游戏,Swing版。
  2. python3字典(Map)
  3. 关于checkbox
  4. Linux下定时器使用
  5. 面向对象设计原则之3-里氏替换原则
  6. (45)FPGA面试技能提升篇(Hyperlink接口)
  7. micropython做产品开发_关于MicroPython是否可以真正用在产品开发的讨论
  8. 区分 点操作符+属性名 和 getAttribute()
  9. 计算机电容与晶体管等硬件的作用,太实用了|开关电源中各元器件的命名与用途!-EDA365电子论坛通信数码-人工智能-计算机-半导体-手机家电消费电子硬件门户网站...
  10. 全行业产业链图示(摘自企查查)
  11. 形式语言与自动机总结
  12. 自己来制作iso镜像用于安装OpenBSD
  13. 绘制网络组建拓扑图方法分享
  14. shell笔记(C语言中文网)
  15. 理财基金国瀚实业公司理财:不懂理财知识如何做好投资
  16. 产品经理的六大工作职责
  17. HihoCoder - 1847
  18. 中国医护服装制造行业投资前景与盈利能力分析报告2022版
  19. 电脑黑屏提示missing operating system怎么办
  20. 开发年终奖38个月薪资?888888奖金?普通软件测试工程师又能拿多少?

热门文章

  1. 干货分享丨​供应链管理-ERP的前世今生
  2. 盒格速 M 2022风口项目电商新玩法
  3. PPT结尾页,除了「谢谢」你还能写点啥?
  4. 遨博机器人支持linux,AUBO\Aubo机器人的ROS环境搭建步骤
  5. 去掉迅雷导致桌面的右下角不时弹出广告
  6. cc2540 Packet Sniffer使用
  7. Windows中的共享文件和文件服务器
  8. 安装Carthage
  9. python中pyecharts 柱状图 折线图混用_Python3 pyecharts生成Html文件柱状图及折线图代码实例...
  10. STM32 定时器2 CH1 CH2 PWM输出 产生呼吸灯效果