牛客 星球游戏 ###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 };
View Code

 

posted @ 2020-08-02 00:18  canwinfor  阅读(186)  评论(0)    收藏  举报