Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
 
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
 
Output
输出 一行有两个数, 最短距离及其花费。
 
Sample Input
3 2 1 2 5 6 2 3 4 5 1 3 0 0
 
Sample Output
9 11
 
Source
哎,终于出来了
 1 #include<iostream>
2 #include<map>
3 #include<cstdio>
4 using namespace std;
5 #define inf 1000000000
6 int s, t;
7 int n, m,k;
8 struct di
9 {
10 int s, money;
11 }dis[1010];
12 struct e
13 {
14 int from, to, distance, cost;
15 }es[100010];
16 void ds()
17 {
18 dis[s].s = 0;
19 while (true)
20 {
21 bool update = false;
22 for (int i = 0; i < k; i++)
23 {
24 if (dis[es[i].from].s != inf && (dis[es[i].to].s > dis[es[i].from].s + es[i].distance ))
25 {
26 dis[es[i].to].s = dis[es[i].from].s + es[i].distance;
27 dis[es[i].to].money = dis[es[i].from].money + es[i].cost;
28 update = true;
29 }
30 else if(dis[es[i].to].s == dis[es[i].from].s + es[i].distance&&dis[es[i].to].money > dis[es[i].from].money + es[i].cost)
31 {
32 dis[es[i].to].s = dis[es[i].from].s + es[i].distance;
33 dis[es[i].to].money = dis[es[i].from].money + es[i].cost;
34 }
35 }
36 if (!update) break;
37 }
38 printf("%d %d\n", dis[t].s, dis[t].money);
39 }
40 int main()
41 {
42 while (cin >> n >> m, n != 0 && m != 0)
43 {
44 k = 0;
45 for (int i = 0; i < m; i++)
46 {
47 int a, b, c, d;
48 scanf("%d %d %d %d", &a,&b,&c,&d);
49 es[k].from = a, es[k].to = b, es[k].distance = c, es[k++].cost = d;
50 es[k].from = b, es[k].to = a, es[k].distance = c, es[k++].cost = d;
51 }
52 for (int i = 0; i <= n; i++)
53 {
54 dis[i].s = inf;
55 dis[i].money = 0;
56 }
57 scanf("%d %d", &s, &t);
58 ds();
59 }
60 return 0;
61 }
 

这是网上大佬的方法,为方便复习,拿来用了;

思路是djkstra的算法,当时我也想用了的,就是不太清楚cost给怎么定义,所以就用了bellman-ford,下次用队列优化的bellman-ford试试

 1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4 #define maxn 1007
5 #define INF 65535
6 using namespace std;
7
8 int start,e;
9 int n,m;
10 int map[maxn][maxn];
11 int cost[maxn][maxn];
12
13 void Dijkstra()
14 {
15 int v,Min,vis[maxn];
16 int d[maxn],c[maxn];
17 for(int i = 1;i <= n;i++) {
18 d[i] = map[start][i];
19 c[i] = cost[start][i];
20 }
21 memset(vis,0,sizeof(vis));
22 vis[start] = 1;
23 for(int i = 1;i <= n;i++)
24 {
25 if(vis[e]) break;
26 Min = INF;
27 for(int j = 1;j <= n;j++)
28 if(!vis[j] && d[j]<Min)
29 Min = d[v=j];
30 vis[v] = 1;
31 for(int j = 1;j <= n;j++)
32 if(!vis[j] && map[v][j]<INF) {
33 if(d[j] > d[v]+map[v][j]) {
34 d[j] = d[v]+map[v][j];
35 c[j] = c[v]+cost[v][j];
36 }
37 else if(d[j] == d[v]+map[v][j])
38 if(c[j] > c[v]+cost[v][j])
39 c[j] = c[v]+cost[v][j];
40 }
41 }
42 printf("%d %d\n",d[e],c[e]);
43 }
44
45 int main()
46 {
47 while(scanf("%d%d",&n,&m) && n+m)
48 {
49 for(int i = 1;i <= n;i++)
50 for(int j = 1;j <= n;j++) {
51 map[i][j] = i==j?0:INF;
52 cost[i][j] = i==j?0:INF;
53 }
54 int a,b,c,d;
55 for(int i = 1;i <= m;i++)
56 {
57 scanf("%d%d%d%d",&a,&b,&c,&d);
58 if(map[a][b]>c)
59 {
60 map[a][b]=map[b][a]=c;
61 cost[a][b]=cost[b][a]=d;
62 }
63 else if(map[a][b]==c)
64 {
65 if(cost[a][b]>d)
66 cost[a][b]=cost[b][a]=d;
67 }
68 }
69 scanf("%d%d",&start,&e);
70 Dijkstra();
71 }
72 return 0;
73 }

3790:最短路径问题(HDU)的更多相关文章

  1. ACM: HDU 3790 最短路径问题-Dijkstra算法

    HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Des ...

  2. HDU - 3790 最短路径问题 (dijkstra算法)

    HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...

  3. HDU ACM 3790 最短路径问题

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  4. HDU 3790最短路径问题 [最短路最小花费]

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)  ...

  5. hdu 3790 最短路径问题(双重权值,dijkstra算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...

  6. hdu 3790 最短路径问题(两个限制条件的最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...

  7. HDU 3790 最短路径问题 (最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...

  8. 最短路径问题 HDU 3790

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  9. #HDU 3790 最短路径问题 【Dijkstra入门题】

    题目: 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. 题解报告:hdu 3790 最短路径问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...

随机推荐

  1. jstl和EL表达式混合使用

    EL表达式里判断字符串,或者... ${(wrt.acceptName eq '刘立荣') || (wrt.acceptName eq '卢伟冰') } <tr> <td heigh ...

  2. VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNTION(翻译)

    0 - ABSTRACT 在这个工作中,我们研究了卷积网络的深度对于它在大规模图像识别设置上的准确率的效果.我们的主要贡献是对使用非常小的卷积核(3×3)来增加深度的网络架构进行彻底评估,这说明了通过 ...

  3. [转] 理解CheckPoint及其在Tensorflow & Keras & Pytorch中的使用

    作者用游戏的暂停与继续聊明白了checkpoint的作用,在三种主流框架中演示实际使用场景,手动点赞. 转自:https://blog.floydhub.com/checkpointing-tutor ...

  4. SpringSecurityOAuth认证配置及Token的存储

    ⒈pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  5. 用户态驱动--UIO机制的实现【转】

    转自:https://blog.csdn.net/u013982161/article/details/51584900 1 uio理论部分   1.1为什么出现了UIO? 硬件设备可以根据功能分为网 ...

  6. python3+requests库框架设计05-unittest单元测试框架

    unittest单元测试框架,主要由四部分组成:测试固件.测试用例.测试套件.测试执行器 测试固件(test fixture) 测试固件有两部分,执行测试前的准备部分setUp(),测试执行完后的清扫 ...

  7. vs 快捷键操作

    各个版本可能不同,以vs 2013为例. 1.调试时,调出即时窗口:[Ctrl+Alt+i] 2.注释/取消注释:[Ctrl+K Ctrl+C]/[Ctrl+K Ctrl+U]

  8. 设计模式C++学习笔记之一(Strategy策略模式)

    无意中,从网上下到一本电子书<24种设计模式介绍与6大设计原则>,很好奇这里有24种设计模式,印象中GOF写的<设计模式>(Design Patterns),好像只有23种吧. ...

  9. 【转】Linux下gcc生成和使用静态库和动态库详解

    一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不 ...

  10. chan array初始化

    package main import "fmt" func run() { chann[0] <- 1 } var chann = make([]chan int, 2) ...