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. 「NowCoder Contest 295」H. Playing games

    还是见的题太少了 「NowCoder Contest 295」H. Playing games 题意:选出尽量多的数使得异或和为$ 0$ $ Solution:$ 问题等价于选出尽量少的数使得异或和为 ...

  2. 最全的jquery datatables api 使用详解

    学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...

  3. R大

    知乎链接 https://www.zhihu.com/collection/114506870

  4. tomcat源码之connector配置

    连接 acceptor /** * Acceptor thread count. */protected int acceptorThreadCount = 0; 处理线程 private int m ...

  5. 下面哪些是无效的Java标识?为什么?

    下面哪些是无效的Java标识?为什么? a.Factorial b.anExtremelyLongIdebtifierifyouAsKMe c.2ndLevel d.level2 e.MAX_SIZE ...

  6. 2.获取公开的漏洞信息-查询还有哪些系统补丁未堵住-查询exp

    本章内容为第一课的实战部分,请结合原创一起浏览. 微软官网 https://www.microsoft.com/zh-cn 在页脚找到TechNet 查看安全公告 MS系列微软编号在微软安全报告中存在 ...

  7. Linux 下的dd命令使用详解(摘录)【转】

    转自:https://www.cnblogs.com/jikexianfeng/p/6103500.html 一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意 ...

  8. 快速开发工具:Servoy

    快速开发工具:Servoy https://servoy.com/

  9. 正则表达式处理BT的html嵌套问题

    在博问里面求教大神,把问题搞定.在此做个记录备份,也给碰到类似问题的园友提供解决思路. 简化的业务场景就是,在页面html标签中的属性中嵌套了html标签,怎么用用正则表达式过滤闭合的html标签(& ...

  10. 常用的16个c/c++面试题

    1. C中static有什么作用 (1)隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命 ...