2 条题解

  • 0
    @ 2023-3-26 17:03:25

    询问chatGPT得到的Accepted答案

    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;
    
    const int INF = 0x3f3f3f3f; // 表示无穷大的值,即两个城市之间没有路
    
    int main()
    {
        int n;
        cin >> n;
        
        vector<vector<int>> map(n, vector<int>(n)); // 表示城市之间距离的矩阵
        
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                cin >> map[i][j];
        
        vector<int> dist(n, INF); // dist[i]表示从1号城市到i号城市的最短距离
        dist[0] = 0;
        
        priority_queue<pair<int,int>, vector<pair<int,int>>, greater<>> pq; // 小根堆,用来辅助Dijkstra算法
        
        pq.push({0, 0}); // 将1号城市放入小根堆
        
        while (!pq.empty())
        {
            auto [d, u] = pq.top();
            pq.pop();
            
            if (d != dist[u]) continue; // 如果pq中取出的最短距离不是当前最短距离,则需要跳过
            
            for (int v = u + 1; v < n; v++) // 对于所有比u大的城市v,更新dist[v]
            {
                if (map[u][v] != 0 && dist[u] + map[u][v] < dist[v]) // 如果有路相连,并且通过u可以更新dist[v]
                {
                    dist[v] = dist[u] + map[u][v]; // 更新dist[v]
                    pq.push({dist[v], v}); // 将v放入小根堆,用于后续处理
                }
            }
        }
        
        cout << dist[n-1] << endl; // 输出最短距离
        
        return 0;
    }
    

    信息

    ID
    529
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    56
    已通过
    14
    上传者