classSolution{public:vector<int>countVisitedNodes(vector<int>& edges){//基环树板子题int n = edges.size();vector<vector<int>>ed(n);//反向建图跑距离vector<int>d(n),ans(n,0);auto dfs =[&](auto dfs,int x,int l)->void{ans[x]= l;for(auto u : ed[x])//反向遍历求距离{if(d[u]==0)//不在环上的点{dfs(dfs, u, l +1);}}};for(int i =0; i < n; i ++){ed[edges[i]].push_back(i);d[edges[i]]++;}queue<int>q;for(int i =0; i < n; i ++){if(d[i]==0) q.push(i);}while(q.size()){int k = q.front();q.pop();auto it = edges[k];d[it]--;if(d[it]==0) q.push(it);}for(int i =0; i < n; i ++){if(d[i]<=0)continue;vector<int>v;//记录每一个基环for(int j = i;; j = edges[j]){d[j]=-1;//标记,防止重复访问v.push_back(j);if(edges[j]== i)break;}for(auto it : v){dfs(dfs, it, v.size());}}return ans;}};