1. 程式人生 > 實用技巧 >牛客程式設計巔峰賽S1第6場 - 黃金&鑽石&王者 C.星球遊戲 (單源最短路,Dijkstra)

牛客程式設計巔峰賽S1第6場 - 黃金&鑽石&王者 C.星球遊戲 (單源最短路,Dijkstra)

  • 題意:有\(n\)個點,\(m\)條雙向邊,兩個方向的權值都是相等的,可以從\(A\)中的某個點出發走到\(B\)中的某個點,求所有路徑中的最短距離,如果A和B中沒有點聯通,則輸出\(-1\).

  • 題解:感覺是個閱讀理解啊,題目看懂了就是個裸的單源最短路,我們首先將牛牛的所有星球初始化作為起點,然後建邊跑個dijkstra,最後再列舉牛妹的星球維護一個最小值即可.

  • 程式碼:

    class Solution {
    public:
        /**
         * 
         * @param niuniu int整型vector 牛牛佔領的p個星球的編號
         * @param niumei int整型vector 牛妹佔領的q個星球的編號
         * @param path int整型vector<vector<>> m條隧道,每條隧道有三個數分別是ui,vi,wi。ui,vi分別是隧道的兩邊星球的編號,wi是它們之間的距離
         * @param nn int整型 星球個數n
         * @return int整型
         */
        struct misaka{
            int out;
            int val;
        }e;
        int dis[1000000];
        bool st[1000000];
        vector<misaka> v[1000000];
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> h;
        
        void dijkstra(){
            while(!h.empty()){
                auto tmp=h.top();
                h.pop();
                
                int num=tmp.second;
                int dist=tmp.first;
                
                if(st[num]) continue;
                st[num]=true;
                
                for(auto w:v[num]){
                    int node=w.out;
                    if(dis[node]>w.val+dist){
                        dis[node]=w.val+dist;
                        h.push({dis[node],node});
                    }
                }
            }
        }
        
         int Length(vector<int>& niuniu, vector<int>& niumei, vector<vector<int> >& path, int nn) {
            // write code here
            memset(dis,0x3f3f3f3f,sizeof(dis));
            memset(st,false,sizeof(st));
            for(auto w:niuniu){
                dis[w]=0;
                h.push({0,w});
            }
            
            for(auto w:path){
                int a=w[0];
                int b=w[1];
                int val=w[2];
                e.out=b,e.val=val;
                v[a].push_back(e);
                e.out=a;
                v[b].push_back(e);
            }
            
            dijkstra();
            int ans=0x3f3f3f3f;
            
            for(auto w:niumei){
                ans=min(ans,dis[w]);
            }
            
            if(ans==0x3f3f3f3f) ans=-1;
            return ans;
            
        }
    };