zoukankan      html  css  js  c++  java
  • 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
    " , 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
    " , dis[v] , cost[v]);
    54     }
    55     return 0;
    56 }
  • 相关阅读:
    《计算学科系统导论》系列路线图
    “知行合一”的高职计算机教学观
    文化的概念
    关于班级博客地址
    一个字符编码处理小程序(一)
    关于计应151/152《软件工程》课程实践的安排
    人人都要学一点系统论
    我与软件工程
    关于本人与本博客
    THUWC前集训9
  • 原文地址:https://www.cnblogs.com/Recoder/p/5549623.html
Copyright © 2011-2022 走看看