Lang:G++
Edit12345678910111213141516171819202122232425262728293031#include<iostream>#include<cstdio>#include<vector>using namespace std;const int N=20000+10;vector<int> edge[N];vector<int> oedge[N];bool vis[N];int timestamp[N];int group[N];int top;void dfs1(int root){vis[root]=true;for(int i=0;i<edge[root].size();i++)if(!vis[edge[root][i]]) dfs1(edge[root][i]);timestamp[top++]=root;}void dfs2(int root,int gId){vis[root]=true;group[root]=gId;for(int i=0;i<oedge[root].size();i++)if(!vis[oedge[root][i]]) dfs2(oedge[root][i],gId);}void addEdge(int a,int b){edge[a].push_back(b);oedge[b].push_back(a);}void init(){for(int i=0;i<N;i++)