• 数据结构实验之图论七:驴友计划 SDUOJ(最短路优化+变形)


     在路径相同的情况下,选择钱最少的,只需要加一个变量 w就可以了。

    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    using namespace std;
    typedef long long ll;
    #define pb push_back
    const int N = 510;
    int INF = 1e9+10;
    struct node{
        int now, d, w;
        bool friend operator<(const node& a, const node& b) {
            if(a.d != b.d) return a.d > b.d;
            else a.w > b.w;
        }
    };
    priority_queue<node>que;
    struct Info{
        int to, d, w;
    };
    vector<Info> E[N];
    int dis[N], cost[N];
    int n, m, S, D;
    void dijkstra()
    {
        for(int i = 0; i <= n; ++i) {
            dis[i] = INF;
            cost[i] = INF;
        }
        dis[S] = cost[S] = 0;
        que.push({S, dis[S], cost[S]});
        while(!que.empty()) {
            int now = que.top().now;   //当前到达的最短的那个点。
            que.pop();
            int _size = E[now].size();
            for(int i = 0; i < _size; ++i) {
               Info info = E[now][i];  //取出和now相连的点。
               if(dis[info.to] > dis[now] + info.d) {   //info.d  to和now的距离. dis[now] 从起点到now点的距离. dis[info.to] 从起点到info.to点的距离
                    dis[info.to] = dis[now] + info.d;
                    cost[info.to] = cost[now] + info.w;     //更新
                    que.push({info.to, dis[info.to], cost[info.to]});
               }else if(dis[info.to] == dis[now] + info.d) {
                    cost[info.to] = cost[now] + info.w;   //更新
                    que.push({info.to, dis[info.to], cost[info.to]});
               }
            }
        }
        printf("%d %d
    ", dis[D], cost[D]);
    }
    
    void solve()
    {
        int T;
        scanf("%d", &T);
        while(T--) {
            scanf("%d%d%d%d", &n, &m, &S, &D);
            for(int i = 1; i <= m; i++) {
                int u, v, d, w;
                scanf("%d%d%d%d", &u, &v, &d, &w);
                E[u].pb({v, d, w});
                E[v].pb({u, d, w});
            }
    
            dijkstra();
            for(int i = 0; i < n; ++i) E[i].clear();
            while(!que.empty()) que.pop();
        }
    }
    int main()
    {
        solve();
        return 0;
    }
    View Code
  • 相关阅读:
    iOS应用开发最佳实践
    Pywinauto 基于Win32 程序的自动化功能测试工具
    通信系统概论---电路交换与分组交换
    手动设置3G的wifi迷你无线路由
    作为一个软件测试工作者的思考
    中国人咋对“拼爹”现象如此诟病?
    HLS协议实现
    div:给div加滚动栏 div的滚动栏设置
    关于PCA算法的一点学习总结
    搜索引擎技术之概要预览
  • 原文地址:https://www.cnblogs.com/sszywq/p/13869159.html
Copyright © 2020-2023  润新知