tygarian

Maximum Employees to Be Invited to a Meeting

Jan 2nd, 2022
554
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.84 KB | None | 0 0
  1. class Solution {
  2. public:
  3. // finding cycles
  4. void dfs(int v,vector<bool>& vis,vector<bool>& rec,vector<int>& par,vector<int> adj[],int& ans){
  5. vis[v] = rec[v] = true;
  6. for(auto& u:adj[v]){
  7. if(!vis[u]){
  8. par[u] = v;
  9. dfs(u,vis,rec,par,adj,ans);
  10. }
  11. else if(rec[u]){
  12. // find the length of cycle
  13. int vertex = v,curr = 1;
  14. while(vertex!=u){
  15. curr++;
  16. vertex = par[vertex];
  17. }
  18. ans = max(ans,curr);
  19. }
  20. }
  21. rec[v] = false;
  22. }
  23. int maximumInvitations(vector<int>& favorite) {
  24. int n = favorite.size();
  25. // cycle finding
  26. vector<int> adj[n],par(n,-1),in(n);
  27. for(int i=0;i<n;i++){
  28. adj[i].push_back(favorite[i]); // i --> favorite[i]
  29. in[favorite[i]]++;
  30. }
  31. vector<bool> vis(n),rec(n);
  32. int ans = 0;
  33. for(int i=0;i<n;i++){
  34. if(!vis[i])
  35. dfs(i,vis,rec,par,adj,ans);
  36. }
  37.  
  38. // toplogical sorting using khan's algo
  39. queue<int> q;
  40. for(int i=0;i<n;i++){
  41. if(!in[i])
  42. q.push(i);
  43. }
  44.  
  45. vector<int> dp(n,1);
  46. while(!q.empty()){
  47. int v = q.front();
  48. q.pop();
  49.  
  50. for(auto& u:adj[v]){
  51. if(--in[u]==0)
  52. q.push(u);
  53. dp[u] = max(dp[u],1+dp[v]);
  54. }
  55. }
  56.  
  57. int sum = 0;
  58. for(int i=0;i<n;i++){
  59. if(favorite[favorite[i]]==i){
  60. // length of cycle = 2;
  61. sum += dp[i] + dp[favorite[i]];
  62. }
  63. }
  64.  
  65. sum/=2;
  66.  
  67. ans = max(ans,sum);
  68. return ans;
  69. }
  70. };
Add Comment
Please, Sign In to add comment