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. angular vue react web前端三大主流框架的对比

    首先,我们先了解什么是MVX框架模式? MVX框架模式:MVC+MVP+MVVM 1.MVC:Model(模型)+View(视图)+controller(控制器),主要是基于分层的目的,让彼此的职责分 ...

  2. 【报错】java.lang.ClassNotFoundException: org.apache.ibatis.session.SqlSession

    报错 java.lang.ClassNotFoundException: org.apache.ibatis.session.SqlSession 或者 java.lang.ClassNotFound ...

  3. MGR架构~高可用架构细节的梳理

    一 简介:今天咱们来聊聊mgr的细节原理相关 二 选择新主机制   1 当主节点宕掉,自动会根据服务器的server_uuid变量和group_replication_member_weight变量值 ...

  4. 关于vue监听dom与传值问题

    1. 代码初始化一次执行部分属性为空的情况 原因: 异步加载 + 立马 传值时 直接渲染 dom里面  能实时更新 (无影响) 不能直接dom中渲染(有影响)     解决方法:需要通过监听的方式来处 ...

  5. w10谷歌chrome关闭自动更新

    运行输入:msconfig打开服务 选择服务,找到谷歌更新 ,点击禁用  ,然后保存 保存会要求重启电脑 ,重启后打开页面谷歌  ,会出现弹窗,是否更新 ,点否 . 然后解决,不会再自动更新了. 这是 ...

  6. pythonのpygame安装

    本地环境: python 3.7.0 windows7 64bit pip pygame地址: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame 通 ...

  7. TextView 文字拼接

    //引用文字 String testStr = (getResources().getString(R.string.test_str,"<font color='#ff0000'&g ...

  8. DataGrid 查不出数据 注意事项

    总结以下几条:1.SQL文在数据控中查询成功在写入,表内字段名尽量复制,手打太容易错了.写SQL写错了,没有智能提示.2.DataGrid数据源先绑定.3.检查parameter顺序,条件的顺序也要考 ...

  9. About me & OI这一年

    1 最近碰到一些 OIers 问我学 OI 的经历 回忆了一下,我做的第一道题是A+B Problem,时间:2018年2月15日 呀,正好一年了 2 我是来自 HB 的 OIer 一枚 现在高一,就 ...

  10. SpringCloud Feign

    ⒈Feign是什么? Feign是Netflix开发的声明式.模板化的HTTP客户端, Feign可以帮助我们更快捷.优雅地调用HTTP API. SpringCloud微服务项目之间调用是通过Res ...