You are given an integer n indicating there are n people numbered from 0 to n - 1. You are also given a 0-indexed 2D integer array meetings where meetings[i] = [xi, yi, timei] indicates that person xi and person yi have a meeting at timei. A person may attend multiple meetings at the same time. Finally, you are given an integer firstPerson.
Person 0 has a secret and initially shares the secret with a person firstPerson at time 0. This secret is then shared every time a meeting takes place with a person that has the secret. More formally, for every meeting, if a person xi has the secret at timei, then they will share the secret with person yi, and vice versa.
The secrets are shared instantaneously. That is, a person may receive the secret and share it with people in other meetings within the same time frame.
Return a list of all the people that have the secret after all the meetings have taken place. You may return the answer in any order.
voidbfs(int person, int time, map<int,vector<pair<int,int>>>& meetings){ if(history[person].first and history[person].second <= time) return; int knownTime = time, beforeKnownTime = history[person].second; history[person].first = true;
auto start = lower_bound(meetings[person].begin(), meetings[person].end(), make_pair(knownTime, INT_MIN)); auto end = lower_bound(meetings[person].begin(), meetings[person].end(), make_pair(beforeKnownTime, INT_MIN)); for(; start != end; start++) { bfs(start->second, start->first, meetings); } } public: vector<int> findAllPeople(int n, vector<vector<int>>& meetings, int firstPerson){ history = vector<pair<bool,int>> (n, {false, INT_MAX}); //know secret , time pair //history[0] = history[firstPerson] = {true, 0}; map<int, vector<pair<int, int>>> meetingMap = buildMeetingMap(meetings); for(auto& [person, meetingList] : meetingMap) { sort(meetingList.begin(), meetingList.end()); }