leetcode 2045. 到达目的地的第二短时间

 1 class Solution {
 2 public:
 3     typedef pair<int,int> pii;
 4     struct cmp{
 5         bool operator ()(pii &a,pii &b)
 6         {
 7             return a.second>b.second;
 8         }
 9     };
10     
11     int secondMinimum(int n, vector<vector<int>>& edges, int time, int change) {
12         vector<int>G[n+1];
13         for(auto &p:edges)
14         {
15             G[p[0]].push_back(p[1]);
16             G[p[1]].push_back(p[0]);
17         }
18         vector<int>dis1(n+1,INT_MAX),dis2(n+1,INT_MAX);
19         priority_queue<pii,vector<pii>,cmp>q;
20         q.push({1,0});
21         dis1[1]=0;
22         int cnt=0,first=INT_MAX;
23         while(q.size())
24         {
25             auto [u,d]=q.top();
26             q.pop(); 
27             for(int i=0;i<G[u].size();i++)
28             {
29                 int v=G[u][i];
30                 int w= (d%(2*change)<change)?d+time:d-(d%(change))+change+time;
31                     if(w<dis1[v])
32                     {
33                         dis2[v]=dis1[v];
34                         dis1[v]=w;
35                         q.push({v,w});
36                     }
37                     else if(w>dis1[v]&&w<dis2[v])
38                     {
39                         dis2[v]=w;
40                         q.push({v,w});
41                     }
42             }
43         }
44         return dis2[n];
45     }
46 };

 

posted @ 2021-12-10 17:31  matt-11  阅读(35)  评论(0)    收藏  举报