1 /*
 2 dfs比较好想,就是测试数据的问题,导致在遍历边的时候要倒着遍历才过!
 3 */
 4 #include<iostream>
 5 #include<cstdio>
 6 #include<cstring>
 7 #include<vector>
 8 #include<algorithm>
 9 #define Max 0x3f3f3f3f
10 using namespace std;
11
12 struct node{
13    int D;
14    int L, T;
15    node(int D, int L, int T){
16       this->D=D;
17       this->L=L;
18       this->T=T;
19    }
20    node(){
21    }
22 };
23
24 node v[105][1000];
25 int cnt[105];
26 int vis[105];
27
28 int maxCost, R, N, S, D, L, T;
29 int cost, dist;
30
31 void dfs(int cur, int d, int c){
32    int i;
33    if(cur == N){
34        if(dist>d){
35           dist=d;
36           if(cost>c)  cost=c;
37        }
38        return ;
39    }
40    for(i=cnt[cur]-1; i>=0; --i)
41       if(!vis[v[cur][i].D] &&  c+v[cur][i].T<=maxCost && d+v[cur][i].L<dist){
42          vis[v[cur][i].D]=1;
43          dfs(v[cur][i].D, d+v[cur][i].L, c+v[cur][i].T);
44          vis[v[cur][i].D]=0;
45       }
46 }
47
48 int main(){
49    while(scanf("%d", &maxCost)!=EOF){
50        scanf("%d%d", &N, &R);
51        memset(cnt, 0, sizeof(cnt));
52        while(R--){
53           scanf("%d%d%d%d", &S, &D, &L, &T);
54           v[S][cnt[S]++]=node(D, L, T);
55        }
56        cost=dist=Max;
57        memset(vis, 0, sizeof(vis));
58        dfs(1, 0, 0);
59        if(cost<=maxCost)
60           printf("%d\n", dist);
61        else printf("-1\n");
62    }
63    return 0;
64 }
 1 /*
 2   spfa + 01背包
 3   dist[next][j]=min(dist[cur][j-v[cur][i].T]+v[cur][i].L) j={v[cur][i].T。。。maxCost}
 4   一维数组表示的是城市节点,二维表示的当前费用
 5   dist[i][j]表示经过i城市,费用为j时总的路径长度!
 6 */
 7 #include<iostream>
 8 #include<cstdio>
 9 #include<cstring>
10 #include<vector>
11 #include<queue>
12 #include<algorithm>
13 #define Max 0x3f3f3f3f
14 using namespace std;
15
16 struct node{
17    int D;
18    int L, T;
19    node(int D, int L, int T){
20       this->D=D;
21       this->L=L;
22       this->T=T;
23    }
24    node(){
25    }
26 };
27
28 node v[105][1000];
29 int cnt[105];
30 int dist[105][10005];
31 int vis[105];
32 queue<int>q;
33 int maxCost, R, N, S, D, L, T;
34
35 int spfa(){
36    int i;
37    while(!q.empty()){
38        int cur = q.front();
39        q.pop();
40        vis[cur]=0;
41        for(i=0; i<cnt[cur]; ++i){
42            int next=v[cur][i].D;
43            for(int j=v[cur][i].T; j<=maxCost; ++j)
44               if(dist[next][j]>dist[cur][j-v[cur][i].T]+v[cur][i].L){
45                  dist[next][j]=dist[cur][j-v[cur][i].T]+v[cur][i].L;
46                  if(!vis[next]){
47                    vis[next]=1;
48                    q.push(next);
49                  }
50              }
51        }
52    }
53 }
54
55 void bfs(int cur){
56    q.push(1);
57    memset(dist, 0x3f, sizeof(dist));
58    for(int i=0; i<105; ++i)
59       dist[1][i]=0;
60    vis[1]=1;
61    spfa();
62 }
63
64 int main(){
65    while(scanf("%d", &maxCost)!=EOF){
66        scanf("%d%d", &N, &R);
67        memset(cnt, 0, sizeof(cnt));
68        while(R--){
69           scanf("%d%d%d%d", &S, &D, &L, &T);
70           v[S][cnt[S]++]=node(D, L, T);
71        }
72        memset(vis, 0, sizeof(vis));
73        bfs(1);
74        int minDist=Max;
75        for(int i=1; i<=maxCost; ++i)
76           if(minDist>dist[N][i])
77               minDist=dist[N][i];
78        if(minDist!=Max)
79           printf("%d\n", minDist);
80        else printf("-1\n");
81    }
82    return 0;
83 }

转载于:https://www.cnblogs.com/hujunzheng/p/3874165.html

poj 1724ROADS(bfs和dfs做法)相关推荐

  1. 利用BFS和DFS解决 LeetCode 130: Surrounded Regions

    问题来源 此题来源于LEETCODE,具体问题详见下面的链接 https://leetcode.com/problems/surrounded-regions/description/ 问题简述 给定 ...

  2. 分别用BFS和DFS求给定的矩阵中“块”的个数

    目录 背景介绍 BFS实现 基本思想 获取相邻位置元素技巧 BFS函数 DFS实现 基本思想 DFS函数 完整代码 背景介绍 背景 给出一个mxn的矩阵,矩阵中的元素为0或1.称位置(x,y)与其上下 ...

  3. BFS和DFS优先搜索算法

    4.教你通透彻底理解:BFS和DFS优先搜索算法 作者:July  二零一一年一月一日 --------------------------------- 本人参考:算法导论  本人声明:个人原创,转 ...

  4. 分享两个常见的搜索算法:BFS和DFS

    本文分享自华为云社区<BFS和DFS算法初探>,作者: ayin. 本次分享两个常见的搜索算法 1.BFS 即广度优先搜索 2.DFS 即深度优先搜索 岛屿数量 给定一个由 '1'(陆地) ...

  5. 【恋上数据结构】图代码实现、BFS、DFS、拓扑排序

    图代码实现 图的基础代码 顶点Vertex 边Edge 添加边addEdge 删除边removeEdge 删除点removeVertex 完整源码 图的遍历 广度优先搜索(Breadth First ...

  6. 如何通透理解:BFS和DFS优先搜索算法(23年修订版)

    前言 本文最早写于二零一一年一月一日,十余年过去,如今再看,之前写的确实一言难尽(包括评论区也有不少朋友指出文章质量.文章排版都有待提高),故重写本文 第一部分 什么是BFS与DFS 1.1 什么是B ...

  7. BFS和DFS算法原理(通俗易懂版)

    DFS 算法 思想:一直往深处走,直到找到解或者走不下去为止 BFS算法 DFS:使用栈保存未被检测的结点,结点按照深度优先的次序被访问并依次被压入栈中,并以相反的次序出栈进行新的检测. BFS:使用 ...

  8. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  9. (五)算法与数据结构 | BFS和DFS

    文章目录 0. 简介 1. 广度优先搜索 2. 深度优先搜索 3. 总结 0. 简介 广度优先搜索(BreadthFirstSearch,BFS{\rm Breadth\ First\ Search, ...

最新文章

  1. Install Package and Software
  2. 10个 Python 程序员,9个不合格?
  3. Angular中ngModel的$render的详解
  4. 多进程减少多个文件的内存占用
  5. OO第三次博客作业---透过代码看设计
  6. php pcntl 多进程学习
  7. 2016年,我的和自己谈谈
  8. 多所高校通知:暂缓返校
  9. artTemplate
  10. iOS App创建桌面快捷方式
  11. pku 3207 Ikki's Story IV - Panda's Trick 2-sat判定是否存在可行解
  12. 使用redis作为缓存,数据还需要存入数据库中吗?
  13. (2016弱校联盟十一专场10.2) E.Coins
  14. IDEA ideaIU点击无反应
  15. javascript特效大全
  16. ADB的使用-简单命令
  17. Python抖音去水印_一步到位_一蓑烟雨任平生
  18. matlab中grid的用法
  19. 响应式H5图片网盘外链系统源码 自适应PC手机端
  20. CHD6.3环境中,集中kylin3.0,错误解决.NoClassDefFoundError: org/apache/commons/configuration/ConfigurationE

热门文章

  1. 计算机论文哪儿找,查找关于计算机毕业论文.docx
  2. elasticsearch-7.15.2 同时支持中文ik分词器和pinyin分词器
  3. maven 私服 nexus3 settings.xml
  4. PLSQL查询字段为科学计数法,修正显示
  5. Excel VBA 怎样为 inputBox 输入框设置星号掩码-密码屏蔽输入框
  6. docker-compose的介绍与安装(结合官方文档)
  7. 递归(特别重要,小计算用)
  8. vue 圆形 水波_vue项目百度地图+echarts的涟漪水波效果
  9. python 打开pdf文件_Python3检验pdf文件是否有效
  10. springboot dubbo引入包_spring boot 集成 dubbo 企业完整版