强联通

#include<bits/stdc++.h>using namespace std;const int maxn=1e6+10;vector<int> g[maxn];vector<int> rg[maxn];vector<int> vs;bool vis[maxn];int camp[maxn];void add_edge(int x,int y) { g[x].push_back(y); rg[y].push_back(x); }void dfs(int x){ vis[x]=1; for(int i=0;i<g[x].size();i++) if(!vis[g[x][i]]) dfs(g[x][i]); vs.push_back(x);}void rdfs(int x,int k){ vis[x]=1; camp[k]=k; for(int i=0;i<rg[x].size();i++) if(!vis[rg[x][i]]) rdfs(rg[x][i],k++);}int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++) { int x,y; add_edge(x,y); } for(int i=1;i<=n;i++) { if(!vis[i]) dfs(i); } memset(vis,0,sizeof(vis)); int k=0; for(int i=vs.size();i>=0;i--) { if(!vis[vs[i]]) rdfs(vs[i],k++); }}

 

相关文章