leetocde 5941. 找出知晓秘密的所有专家


1 typedef pair<int,int> pii; 2 const int N=1e5+5; 3 class Solution { 4 public: 5 struct cmp{ 6 bool operator()(pii &a, pii &b) 7 { 8 return a.second>b.second; 9 } 10 }; 11 12 int dis[N]; 13 vector<int> findAllPeople(int n, vector<vector<int>>& meetings, int firstPerson) { 14 memset(dis,0x3f,sizeof(dis)); 15 vector<pii>G[N]; 16 vector<int>ans; 17 priority_queue<pii,vector<pii>,cmp>pq; 18 for(auto &p:meetings) 19 { 20 int u=p[0],v=p[1],d=p[2]; 21 G[u].push_back({v,d}); 22 G[v].push_back({u,d}); 23 } 24 dis[0]=0; 25 G[0].push_back({firstPerson,0}); 26 pq.push({0,0}); 27 while(pq.size()) 28 { 29 auto [u,d]=pq.top(); 30 pq.pop(); 31 if(dis[u]<d)continue; 32 ans.push_back(u); 33 for(auto &[v,dv]:G[u]) 34 { 35 if(dv>=d&&dv<dis[v]) 36 { 37 pq.push({v,dv}); 38 dis[v]=dv; 39 } 40 } 41 } 42 return ans; 43 } 44 };
这是dijkstra的变形题,关键在于能否看出用两个专家的时间代替距离,这样更新的时候我们判断一下当前节点的所有dis[u]与当前时间线d的关系,dis[u]<d说明u在前面更新过,u的专家已经知道信息了。更新的时候取判断与u专家开会的其他专家,如果d[v]>=d,说明v的时间线在d后面,从而v也是能获取信息的,否则v在当前d的前面v是不能知道信息的,由dij算法原理,我们知道每个专家u的d是它知道信息的最开始时间。从而算法是正确的。
1 typedef pair<int,int> pii; 2 class Solution { 3 public: 4 5 vector<int> findAllPeople(int n, vector<vector<int>>& meetings, int firstPerson) { 6 vector<int>ans; 7 int f[n]; 8 memset(f,0,sizeof(f)); 9 f[0]=1;f[firstPerson]=1; 10 map<int,vector<pii>>mp; 11 for(auto &p:meetings) 12 { 13 int u=p[0],v=p[1],time=p[2]; 14 mp[time].push_back({u,v}); 15 } 16 for(auto &t:mp) 17 { 18 unordered_map<int,vector<int>>G; 19 for(auto &[u,v]:t.second) 20 { 21 G[u].push_back(v); 22 G[v].push_back(u); 23 } 24 queue<int>q; 25 for(auto &p:G) 26 { 27 if(f[p.first]) 28 q.push(p.first); 29 } 30 while(q.size()) 31 { 32 auto u=q.front(); 33 q.pop(); 34 for(auto &v:G[u]) 35 { 36 if(!f[v]) 37 { 38 q.push(v); 39 f[v]=1; 40 } 41 } 42 } 43 } 44 for(int i=0;i<n;i++)if(f[i])ans.push_back(i); 45 return ans; 46 } 47 };
按时间建图的做法复杂度好高啊,也是我一开始先预处理;

浙公网安备 33010602011771号