牛客程式設計巔峰賽S1第6場 - 黃金&鑽石&王者 C.星球遊戲 (單源最短路,Dijkstra)
阿新 • • 發佈:2020-07-26
-
題意:有\(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; } };