牛客 星球游戏 ###K ###K //K
题目链接:https://ac.nowcoder.com/acm/contest/6629/C
思路:我们把每一个牛牛占领的点都标为起点, 建虚拟原点 到起点的距离为0 然后跑一遍dijkstra 后 再去遍历所有牛妹的点的dis[i] 求出最小值即可
全部标记后相当于单源最短路
1 class Solution { 2 public: 3 /** 4 * 5 * @param niuniu int整型vector 牛牛占领的p个星球的编号 6 * @param niumei int整型vector 牛妹占领的q个星球的编号 7 * @param path int整型vector<vector<>> m条隧道,每条隧道有三个数分别是ui,vi,wi。ui,vi分别是隧道的两边星球的编号,wi是它们之间的距离 8 * @param nn int整型 星球个数n 9 * @return int整型 10 */ 11 vector<pair<int,int>>E[100005]; 12 int dis[100005]; 13 void dijkstra() 14 { 15 priority_queue<pair<int,int>>q; 16 for(int i=1;i<1e5;i++) 17 { 18 if(dis[i]==0) 19 q.push({0,i}); 20 } 21 while(!q.empty()) 22 { 23 int u=q.top().second; 24 q.pop(); 25 for(auto &v:E[u]) 26 { 27 if(dis[v.first]>dis[u]+v.second) 28 { 29 q.push({-v.second,v.first}); 30 dis[v.first]=dis[u]+v.second; 31 } 32 } 33 } 34 } 35 int Length(vector<int>& niuniu, vector<int>& niumei, vector<vector<int> >& path, int nn) 36 { 37 for(int i=1;i<1e5;i++) 38 { 39 dis[i]=1e9; 40 } 41 for(auto &v:niuniu) 42 { 43 dis[v]=0; 44 } 45 for(auto &v:path) 46 { 47 int x=v[0]; 48 int y=v[1]; 49 int z=v[2]; 50 E[x].push_back({y,z}); 51 E[y].push_back({x,z}); 52 53 } 54 dijkstra(); 55 int min1=1e9; 56 for(auto &v:niumei) 57 { 58 min1=min(min1,dis[v]); 59 } 60 if(min1==1e9) 61 return -1; 62 else 63 return min1; 64 65 // write code here 66 } 67 };

浙公网安备 33010602011771号