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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790

题目大意:题意明了,输出最短路径及其花费。

需要注意的几点:(1)当最短路径相同时,输出最小花费!!!

(2)更新路径的时候要注意更新花费。

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 const int INF=9999999;
 5 int map[1010][1010],Min,n,cost[1010][1010],node[1010],vis[1010];
 6 int pr[1010];
 7
 8 void set()
 9 {
10     for (int i=1; i<=n; i++)
11     {
12         vis[i]=0;
13         node[i]=INF;
14         pr[i]=INF;
15         for (int j=1; j<=n; j++)
16         {
17             map[i][j]=INF;
18             cost[i][j]=INF;
19         }
20     }
21 }
22
23 void dijkstra(int m)
24 {
25     int tm=m;
26     vis[m]=1;
27     node[m]=0;
28     pr[m]=0;
29     for (int k=2; k<=n; k++)
30     {
31         Min=INF;
32         int M=INF;
33         for (int i=1; i<=n; i++)
34             if(!vis[i])
35             {
36                 if (node[i]>map[tm][i]+node[tm])
37                 {
38                     node[i]=map[tm][i]+node[tm];
39                     pr[i]=cost[tm][i]+pr[tm];
40                 }
41                 else if(node[i]==map[tm][i]+node[tm])
42                 {
43                     if(pr[i]>cost[tm][i]+pr[tm])
44                     {
45                         node[i]=map[tm][i]+node[tm];
46                         pr[i]=cost[tm][i]+pr[tm];
47                     }
48                 }
49                 if (Min>node[i])
50                 {
51                     M=pr[i];
52                     Min=node[i];
53                     m=i;
54                 }
55                 else if (Min==node[i])
56                 {
57                     if(M>pr[i])
58                     {
59                         M=pr[i];
60                         Min=node[i];
61                         m=i;
62                     }
63                 }
64             }
65         vis[m]=1;
66         tm=m;
67     }
68 }
69
70 int main ()
71 {
72     int a,b,d,p,m;
73     while(scanf("%d%d",&n,&m),n||m)
74     {
75         set();
76         while (m--)
77         {
78             scanf("%d%d%d%d",&a,&b,&d,&p);
79             if (map[a][b]>d)
80             {
81                 cost[a][b]=cost[b][a]=p;
82                 map[a][b]=map[b][a]=d;
83             }
84             else if (map[a][b]==d)
85             {
86                 if (cost[a][b]>p)
87                     cost[a][b]=cost[b][a]=p;
88             }
89         }
90         scanf("%d%d",&a,&b);
91         dijkstra(a);
92         printf ("%d %d\n",node[b],pr[b]);
93     }
94 }

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

时间: 2024-08-07 04:10:17

hdu 3790 最短路径问题(双重权值,dijkstra算法)的相关文章

HDOJ 3790 双权值Dijkstra

1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <cstring> 5 using namespace std; 6 7 const int INF = 1000000; 8 const int MAXSIZE = 1005; 9 10 int map[MAXSIZE][MAXSIZE]; 11 int price[MAXSIZE][MAXSIZE]; 1

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

HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是

HDU 3790 最短路径问题(SPFA || Dijkstra )

题目链接 题意 : 中文题不详述. 思路 :无论是SPFA还是Dijkstra都在更新最短路的那个地方直接将花费更新了就行,还有别忘了判重边,话说因为忘了判重边WA了一次. 1 //3790 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 #include <queue> 7 const int INF = 1 <

hdu 3790 最短路径问题(dijkstra)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 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<

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

http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,只是在判断条件时多考虑了花费. 注意重边. #include <stdio.h> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h>

【最短路+最小费用】hdu 3790 最短路径问题

Source : hdu 3790 最短路径问题 http://acm.hdu.edu.cn/showproblem.php?pid=3790 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,终

HDU 2544 最短路(我的dijkstra算法模板、SPAFA算法模板)

思路:这道题是基础的最短路径算法,可以拿来试一下自己对3种方法的理解 dijkstra主要是从第一个点开始枚举,每次枚举出当当前最小的路径,然后再以那最小的路径点为起点,求出它到其它未标记点的最短距离 bellman-ford 算法则是假设有向网中有n 个顶点.且不存在负权值回路,从顶点v1 和到顶点v2 如果存在最短路径,则此路径最多有n-1 条边.这是因为如果路径上的边数超过了n-1 条时,必然会重复经过一个顶点,形成回路:而如果这个回路的权值总和为非负时,完全可以去掉这个回路,使得v1到v

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法 本篇名言:"辛勤的蜜蜂永没有时间悲哀.--布莱克" 这次来看下Dijkstra )算法.还是老方法,先原理,后实现.代码来自网络. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47046031 1.  最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 管道铺设.线路安排

HDU 1874 畅通工程续(初涉dijkstra算法实现)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 dijkstra算法实现可参照此博客学习:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 44302 Acc