Dij| #最短路径问题#

最短路径问题

https://www.nowcoder.com/practice/e372b623d0874ce2915c663d881a3ff2

注意

题目是无向图,且输入的边,在后续输入时可能替换前面的边。也就是说边只会存在一条且是无向边。

#include <iostream>
#include <vector>
using namespace std;

class Graph {
  public:
    //无穷
    const int inf = 1e8 + 7;
    //邻接矩阵,使用pair是因为有花费 e[i][j].first是距离,e[i][j].second是花费
    vector<vector<pair<int, int>>> e;
    int n;
    Graph(int n, vector<vector<int>>& edges) {
        this->n = n;
        //不可达的花费和距离都是无穷
        this->e = vector(n, vector<pair<int, int>>(n, {inf, inf}));
        //初始化邻接矩阵,inf表示不存在边
        for (auto edge : edges) {
            if(edge[2]<e[edge[0]-1][edge[1]-1].first){
                e[edge[0]-1][edge[1]-1]={edge[2],edge[3]};
                e[edge[1]-1][edge[0]-1]={edge[2],edge[3]};
            }else if(edge[2]<e[edge[0]-1][edge[1]-1].first&&edge[3]<e[edge[0]-1][edge[1]-1].second){
                e[edge[0] - 1][edge[1] - 1] = {edge[2], edge[3]};
                e[edge[1] - 1][edge[0] - 1] = {edge[2], edge[3]};
            }
            
        }
    }

    void addEdge(vector<int> edge) {
        e[edge[0] - 1][edge[1] - 1] = {edge[2], edge[3]};
    }

    //返回node1到node2的最短距离和最短花费(距离相同是花费最少)
    pair<int, int> shortestPath(int node1, int node2) {
        //自己到自己是0
        //求node1到其他节点i的最短路径
        vector<int> dis(n, inf); //记录路径结果
        vector<bool> visited(n, false); //记录已经找到最短路径的节点
        vector<int> expend(n, inf); //花费

        dis[node1] = 0;//自己到自己的距离为0
        expend[node1] = 0; //花费为0

        //进行n轮即可
        for (int j = 0; j < n; j++) {
            int u = -1, min_dis = inf;
            //找到已经找到最短路径的dis中的最小的路径
            for (int i = 0; i < n; i++) {
                if (!visited[i] && dis[i] < min_dis) {
                    u = i;
                    min_dis = dis[i];
                }
            }
            //说明不连通,有节点不可达
            if (u == -1) return {-1, -1};
            //说明已经到达node2
            if (u == node2) {
                return {dis[u], expend[u]};
            }
            //第一轮一定u==node1
            visited[u] = true;
            //更新邻居的距离和花费
            for (int i = 0; i < n; i++) {
                if (!visited[i] ) {
                    int new_dis = dis[u] + e[u][i].first, new_expend = expend[u] + e[u][i].second;
                    //距离优先
                    if (new_dis < dis[i]) {
                        dis[i] = new_dis;
                        expend[i] = new_expend;
                    }
                    //距离相同时候,花费优先
                    else if (new_dis == dis[i] && new_expend < expend[i])
                        expend[i] = new_expend;
                }
            }
        }
        //此时dis就是node1到其他节点的最短路径数组
        return {-1, -1};
    }
};

//Dij
int main() {
    int n, m, a, b;
    while (cin >> n >> m) { // 注意 while 处理多个 case
        if (n == 0 && m == 0) break;
        //边集合
        vector<vector<int>> edges(m, vector<int>(4, 0));
        for (int i = 0; i < m; i++) {
            cin >> edges[i][0] >> edges[i][1] >> edges[i][2] >> edges[i][3];
        }
        //建图
        Graph g(n, edges);
        cin >> a >> b;
        auto res = g.shortestPath(a - 1, b - 1);
        cout << res.first << " " << res.second << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

明天不下雨了:我靠2022了都去字节了还什么读研我教你****:你好,本人985电子科大在读研一,本科西南大学(211)我在字节跳动实习过。对您的岗位很感兴趣,希望获得一次投递机会。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 听劝,这个简历怎么改 #
14099次浏览 183人参与
# 面试被问“你的缺点是什么?”怎么答 #
6405次浏览 99人参与
# 水滴春招 #
16488次浏览 349人参与
# 入职第四天,心情怎么样 #
11321次浏览 63人参与
# 租房找室友 #
8027次浏览 53人参与
# 读研or工作,哪个性价比更高? #
26163次浏览 356人参与
# 职场新人生存指南 #
199236次浏览 5510人参与
# 参加完秋招的机械人,还参加春招吗? #
27000次浏览 276人参与
# 文科生还参加今年的春招吗 #
4118次浏览 31人参与
# 简历无回复,你会继续海投还是优化再投? #
48629次浏览 561人参与
# 你见过最离谱的招聘要求是什么? #
144719次浏览 829人参与
# 如果重来一次你还会读研吗 #
155719次浏览 1706人参与
# 机械人选offer,最看重什么? #
69077次浏览 449人参与
# 选择和努力,哪个更重要? #
44310次浏览 493人参与
# 如果再来一次,你还会学硬件吗 #
103647次浏览 1245人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
20521次浏览 414人参与
# 招聘要求与实际实习内容不符怎么办 #
46753次浏览 494人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
4652次浏览 27人参与
# 你们的毕业论文什么进度了 #
901291次浏览 8961人参与
# 软开人,你觉得应届生多少薪资才算合理? #
81379次浏览 496人参与
# 国企还是互联网,你怎么选? #
109198次浏览 853人参与
牛客网
牛客企业服务