题目:http://poj.org/problem?id=3411

题意:n 个城市,m 条路,每条路都有两种情况的费用,一种是 在 b 城市付费 r,一种是提前在 c 城市付费 p 元,问从 1 到 n 最小的花费

思路:邻接表 + dfs

View Code

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <string.h>
 4 #include <algorithm>
 5 #define N 20
 6 #define inf 100000000
 7 #define _clr(a,val) (memset(a,val,sizeof(a)))
 8
 9 using namespace std;
10
11 int vis[N];
12 int head[N];
13 struct node
14 {
15     int a,b,c,p,r;
16     int next;
17 }point[N];
18 int n,m;
19 int minn;
20 void dfs(int x,int sum)
21 {
22     if(sum > minn || vis[x] > n) return;  // 当一个节点被访问n次时,就没必要再访问了
23     if(x == n)
24     {
25         if(sum < minn) minn = sum;
26         return ;
27     }
28     int t = head[x];
29     while(t != -1)
30     {
31         vis[point[t].b] ++;
32         if(vis[point[t].c] > 0) dfs(point[t].b,sum + point[t].p);
33         else dfs(point[t].b , point[t].r + sum);
34         vis[point[t].b] --;
35         t = point[t].next;
36     }
37 }
38 int main()
39 {
40     int i;
41     //freopen("data.txt","r",stdin);
42     while(scanf("%d%d",&n,&m) != EOF)
43     {
44         _clr(vis,0);
45         _clr(head,-1);
46         for(i = 0; i < m; i++)
47         {
48             scanf("%d%d%d%d%d",&point[i].a,&point[i].b,&point[i].c,&point[i].p,&point[i].r);
49             point[i].next = head[point[i].a];
50             head[point[i].a] = i;
51         }
52         minn = inf;
53         vis[1] = 1;
54         dfs(1,0);
55         if(minn == inf) printf("impossible\n");
56         else printf("%d\n",minn);
57     }
58     return 0;
59 }

题目:http://poj.org/problem?id=1724

题意:n个城市 m 条路,每条路有两个参数,一个是长度,一个是费用,给出Bob拥有的钱,问从1 到 n在 可以付的起费的情况下的做短路长度

思路:用优先队列保存加进来的点(在不超过 Bob最多钱的情况下),然后bfs当找到n时就输出并退出

View Code

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <string.h>
 4 #include <queue>
 5 #include <algorithm>
 6 #define N 10010
 7 #define inf 100000000
 8 #define _clr(a,val) (memset(a,val,sizeof(a)))
 9
10 using namespace std;
11
12 struct node
13 {
14     int point;
15     int len;
16     int cost;
17     friend bool operator < (node a,node b)  // 定义顺序
18     {
19         return a.len > b.len;
20     }
21 };
22 struct tnode
23 {
24     int f,t,l,c;
25     int next;
26 }eage[N];
27 int s,d,r;
28 int head[N];
29 void bfs()
30 {
31     node tem;
32     int flag = 0;
33     tem.point = 1, tem.len = tem.cost = 0;
34     priority_queue<node>qu;
35     qu.push(tem);
36     while(!qu.empty())
37     {
38         //cout<<"999\n";
39         node temp = qu.top();
40         qu.pop();
41         if(temp.point == d)
42         {
43             printf("%d\n",temp.len);
44             flag = 1;
45             break;  //找到了就输出并退出
46         }
47         int i = head[temp.point];
48         while(i != -1)
49         {
50             node ttem;
51             ttem.point = eage[i].t, ttem.len = temp.len + eage[i].l, ttem.cost = temp.cost + eage[i].c;
52             if(ttem.cost <= s)
53             {
54                 qu.push(ttem);
55             }
56             i = eage[i].next;
57         }
58     }
59     if(!flag) printf("-1\n");
60     return ;
61 }
62 int main()
63 {
64     int i;
65     //freopen("data.txt","r",stdin);
66     while(scanf("%d%d%d",&s,&d,&r) != EOF)
67     {
68         _clr(head,-1);
69         for(i = 0; i < r; i++)
70         {
71             scanf("%d%d%d%d",&eage[i].f,&eage[i].t,&eage[i].l,&eage[i].c);
72             eage[i].next = head[eage[i].f], head[eage[i].f] = i;
73         }
74         bfs();
75     }
76     return 0;
77 }

转载于:https://www.cnblogs.com/fxh19911107/archive/2012/08/07/2627187.html

poj 3411 1724相关推荐

  1. poj 3411(DFS多点访问)

    题意:有n座城市和m(1<=n,m<=10)条路.现在要从城市1到城市n.有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱,如果没有去过就付R的钱.求的是最少要花多 ...

  2. poj 3411 Paid Roads (dfs)

    题目链接 题意:有N个城市被M条道路连接起来了,每两个城市之间可能存在超过一条路,但是城市之间是单向连接的. 每条路是要花费的.每条路的花费可以选择两种方式:1:假如a城市到达b城市,如果之前经过了c ...

  3. POJ 3411 DFS

    大致题意: 有n座城市和m(1<=n,m<=10)条路.现在要从城市1到城市n.有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱,如果没有去过就付R的钱.求的是最少 ...

  4. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  5. poj 1724 有限制的最短距离(优先队列+链表)

    题目链接:http://poj.org/problem?id=1724 题目大意:给你一个最大费用,让你在费用容许的范围内(情况下)求有源点到终点的最短距离,也就是一般的单源最小距离,不同之处在于加了 ...

  6. 【POJ - 1724 】ROADS (带限制的最短路 或 dfs 或 A*算法,双权值)

    题干: N cities named with numbers 1 ... N are connected with one-way roads. Each road has two paramete ...

  7. POJ 1724 二维费用最短路

    题目大意: 有N个城市,编号1-N 有R条路,每条路(单向)的起点为Si,终点为Di,长度为Li,如果要走这条路需要花Ti的钱 现在你只有K元钱,求在不超支的前提下,从1走到N需要的最短距离 这里总是 ...

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

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

  9. ROADS POJ - 1724(限制条件的最短路)【邻接表+深搜】

    思路:先说下题意,题意第一行给了一个k,代表你有k的钱数,下一行有一个n,代表n个点,然后一个m,代表m条边,然后接下来m行,每行有四个数,分别代表起点.终点.路径长度和要花费的钱数,题目想问在花的钱 ...

最新文章

  1. 美妆彩妆宣传PPT模板
  2. Django中STATIC_URL、STATIC_ROOT、STATICFILES_DIRS 的区别关系
  3. 蚂蚁金服面试经历!临场发挥!
  4. 二级菜单HTML原理,CSS多级菜单的实例代码讲解
  5. C#——一个简单的文件管理器
  6. SQL分页查询的介绍以及好处~~
  7. 教你轻松构建基于 Serverless 架构的小程序
  8. 使用cmd命令创建maven(web)项目+项目转换成IDEA项目+项目打包+Jetty运行Web项目
  9. java.lang.IllegalStateException: Max number of active transactions reached:50
  10. ubuntu系统安装socket服务器,ubuntu 服务器安装socket需要安装啥
  11. 通过VBA实现FTP自动下载及关键字检索等功能
  12. MC9S中断函数编写
  13. 推荐几款免费的MacOS/MacBook pro/MacBook air读取NTFS格式磁盘软件(完全免费)
  14. mysql复制表结构(包括索引)
  15. [TEST123] Performance Test
  16. 自动连上dns服务器啥意思,自动分配DNS服务器和手动设置有什么区别
  17. 如何正确撰写sci论文中的作者信息
  18. 【算法笔记】莫队算法(基础莫队,带修莫队,回滚莫队,树上莫队,二次离线莫队)
  19. 直接在html打开ppt,无需频繁跳转 教你在PPT内直接看网页
  20. python库numpy使用技巧(一)——提取数组中非零元素

热门文章

  1. matlab 自动处理数据,Matlab Remote IPC自动化数据处理
  2. linux非权限安装bioperl,BioPerl安装指南:Unix/Linux/Windows下的安装
  3. php redis编程,php + redis 实现关注功能
  4. android高德地图自定义图层,自定义图层-Canvas
  5. android第三方代码,Android--第三方控件--okHttp(示例代码)
  6. 定时器和promise_分析 Promise 内部实现
  7. java 学生信息的增删改查_学生信息的增删改查(java)
  8. 基于FPGA的竞赛抢答器
  9. php上传图片类型代码,php 上传图片的代码
  10. 信用评分python_信用评分卡(python)