题解 | 最短路径问题

最短路径问题

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

#include <cmath>
#include <endian.h>
#include <iostream>
#include <vector>
using namespace std;

typedef struct Edge{
    int position;
    int cost;
    int distance;
}Edge;

vector<Edge> ascs[1001];
int cost[1001];// 最小花费
int dist[1001];// 最小距离
bool mask[1001];// 是否访问标记
const int Max = 1215752192;// 最大值

Edge getMin(){
    Edge min;
    min.position = Max;
    min.cost = Max;
    min.distance = Max;
    for(int i=1; i<=dist[0]; i++){
        if(mask[i]) continue;
        if(min.distance > dist[i] || (min.distance == dist[i] && min.cost > cost[i])){
            min.position = i;
            min.cost = cost[i];
            min.distance = dist[i];
        }
    }
    return min;
}

void dijkstra(int s){
    // 处理起点
    Edge min;
    min.position = s;
    cost[min.position] = 0;
    dist[min.position] = 0;
    mask[min.position] = true;
    // 循环处理每个点
    for(int i=0; i<dist[0]; i++){
        for(Edge t : ascs[min.position]){
            // 跳过已经标记的
            if(mask[t.position]) continue;
            // 更新最小距离,最小花费
            if(dist[t.position] ==  Max || 
            dist[t.position] > dist[min.position] + t.distance ||
            (dist[t.position] == dist[min.position] + t.distance && cost[t.position] > cost [min.position] + t.cost)){
                dist[t.position] = dist[min.position] + t.distance;
                cost[t.position] = cost [min.position] + t.cost;
            }
        }
        // 寻找最小值
        min = getMin();
        if(min.position == Max) break;
        mask[min.position] = true;
    }
}

int main() {
    int n, m;
    while (cin >> n >> m) {
        if(n==0 && m==0)
            break;
        // 初始化
        for(int i=1; i<=n; i++){
            cost[i] = Max;
            dist[i] = Max;
            mask[i] = false;
            ascs[i].clear();
        }
        dist[0] = n;   
        // 读取数据构造图
        int tmp, t;
        for(int i=0; i<m; i++){
            // tmp -> e->position
            cin >> tmp;
            Edge *e = new Edge;
            cin >> e->position >> e->distance >> e->cost;
            ascs[tmp].push_back(*e);
            // e->position -> tmp
            t=tmp;
            tmp = e->position;
            e->position = t;
            ascs[tmp].push_back(*e);
        }
        // 计算最短距离,以及花费
        int s;
        cin >> s >> t;
        dijkstra(s);
        cout << dist[t] << " " << cost[t] << endl;
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务