1 class Solution { 2 public: 3 int maximumInvitations(vector<int>& favorite) { 4 int n=favorite.size(); 5 vector<int>ind(n); 6 for(int i=0;i<n;i++)ind[favorite[i]]++; 7 vector<int>mxlen(n,1); 8 queue<int>q; 9 for(int i=0;i<n;i++) 10 if(!ind[i])q.push(i); 11 12 while(q.size()) 13 { 14 auto u=q.front(); 15 q.pop(); 16 --ind[favorite[u]]; 17 mxlen[favorite[u]]=max(mxlen[u]+1,mxlen[favorite[u]]); 18 if(!ind[favorite[u]]) q.push(favorite[u]); 19 } 20 int f[n]; 21 memset(f,0,sizeof(f)); 22 function<int(int u)>dfs=[&](int u) 23 { 24 if(f[u])return 0; 25 f[u]=1; 26 int v=favorite[u]; 27 return dfs(v)+1; 28 }; 29 int mx1=0,mx2=0; 30 for(int i=0;i<n;i++) 31 { 32 if(!ind[i]||f[i])continue; 33 int cnt=dfs(i); 34 if(cnt==2)mx2+=mxlen[i]+mxlen[favorite[i]]; 35 else mx1=max(mx1,cnt); 36 } 37 return max(mx1,mx2); 38 } 39 };
学会了用拓扑排序找链,找环。