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

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

简单的最短路问题,这题听说有重边。我用spfa和dijkstra写了一遍,没判重边,速度都差不多。

dijkstra+优先队列:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 #include <vector>
 6 using namespace std;
 7 const int INF = 1e9 + 7;
 8 struct Node {
 9     int _node , _dis , _cost;
10     bool operator <(const Node &cmp) const {
11         if(_dis == cmp._dis)
12             return _cost > cmp._cost;
13         return _dis > cmp._dis;
14     }
15 };
16 struct Edge {
17     int to , _dis , _cost , next;
18 }edge[int(2e5 + 5)];
19 int dis[1005] , cost[1005] , head[1005] , cnt;
20
21 inline void add(int u , int v , int _dis , int _cost) {
22     edge[cnt].next = head[u];
23     edge[cnt].to = v;
24     edge[cnt]._cost = _cost;
25     edge[cnt]._dis = _dis;
26     head[u] = cnt++;
27 }
28
29 void dijkstra(int s) {
30     dis[s] = cost[s] = 0;
31     priority_queue <Node> que;
32     while(!que.empty()) {
33         que.pop();
34     }
35     que.push(Node{s , 0 , 0});
36     while(!que.empty()) {
37         Node temp = que.top();
38         que.pop();
39         int u = temp._node;
40         if(temp._dis > dis[u])
41             continue;
42         for(int i = head[u] ; ~i ; i = edge[i].next) {
43             int v = edge[i].to;
44             if(dis[v] > dis[u] + edge[i]._dis) {
45                 dis[v] = dis[u] + edge[i]._dis;
46                 cost[v] = cost[u] + edge[i]._cost;
47                 que.push(Node{v , dis[v] , cost[v]});
48             }
49             else if(dis[v] == dis[u] + edge[i]._dis && cost[v] > cost[u] + edge[i]._cost) {
50                 cost[v] = cost[u] + edge[i]._cost;
51                 que.push(Node{v , dis[v] , cost[v]});
52             }
53         }
54     }
55 }
56
57 int main()
58 {
59     int n , m , u , v , d , c;
60     while(~scanf("%d %d" , &n , &m) && (n || m)) {
61         for(int i = 1 ; i <= n ; ++i)
62             cost[i] = dis[i] = INF;
63         memset(head , -1 , sizeof(head));
64         cnt = 0;
65         while(m--) {
66             scanf("%d %d %d %d" , &u , &v , &d , &c);
67             add(u , v , d , c);
68             add(v , u , d , c);
69         }
70         scanf("%d %d" , &u , &v);
71         dijkstra(u);
72         printf("%d %d\n" , dis[v] , cost[v]);
73     }
74     return 0;
75 }

spfa:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <vector>
 5 #include <queue>
 6 using namespace std;
 7 const int INF = 1e9 + 7;
 8 typedef pair <int , pair<int , int> > P; //邻接点 长度 花费
 9 int dis[1005] , cost[1005];
10 vector <P> G[1005];
11 void spfa(int s) {
12     dis[s] = cost[s] = 0;
13     queue <int> que;
14     while(!que.empty()) {
15         que.pop();
16     }
17     que.push(s);
18     while(!que.empty()) {
19         int node = que.front();
20         que.pop();
21         for(int i = 0 ; i < G[node].size() ; ++i) {
22             int temp = G[node][i].first;
23             if(dis[temp] > dis[node] + G[node][i].second.first) {
24                 dis[temp] = dis[node] + G[node][i].second.first;
25                 cost[temp] = cost[node] + G[node][i].second.second;
26                 que.push(temp);
27             }
28             else if(dis[temp] == dis[node] + G[node][i].second.first && cost[temp] > cost[node] + G[node][i].second.second) {
29                 cost[temp] = cost[node] + G[node][i].second.second;
30                 que.push(temp);
31             }
32         }
33     }
34 }
35
36 int main()
37 {
38     int n , m , u , v , d , c;
39     while(~scanf("%d %d" , &n , &m) && (n || m)) {
40         for(int i = 1 ; i <= n ; ++i) {
41             dis[i] = cost[i] = INF;
42             G[i].clear();
43             for(int j = i + 1 ; j <= n ; ++j)
44                 to[i][j] = to[j][i] = INF;
45         }
46         for(int i = 0 ; i < m ; ++i) {
47             scanf("%d %d %d %d" , &u , &v , &d , &c);
48             G[u].push_back(P(v , make_pair(d , c)));
49             G[v].push_back(P(u , make_pair(d , c)));
50         }
51         scanf("%d %d" , &u , &v);
52         spfa(u);
53         printf("%d %d\n" , dis[v] , cost[v]);
54     }
55     return 0;
56 }
时间: 2024-11-08 20:51:53

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

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

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 25620    Accepted Submission(s): 7650 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你

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 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 <

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 最短路径问题(双重权值,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,co

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 最短路径问题(Dijkstra+优先队列优化)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题意:中文题(边被赋予两种属性,一种是路径,一种是花费),然后略.(逃...... 今天看了卿学姐的视频,初尝SPFA和Dijkstra. 一个是用队列优化,一个是用优先队列优化.这道题目用这两种方法都可以. dijkstra算法思想(贪心):从距离起点最近的点开始,从这个点遍历一遍它周围的点,进行松弛操作,直到最终点. 整个的算法思想就是贪心,每次都给它形成最短路. 这道题目值得注意的是预处

hdu 3790 最短路径问题(迪杰斯特拉)

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 20555    Accepted Submission(s): 6098 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input