这题是个大好题,良心啊!
我要写题解啊啊啊...
交这题的全都是tarjan的大佬啊,没有kosaraju,我来水一发
至于效率吗,由于STL(咳咳),感人的很TAT
#include<bits/stdc++.h> #define maxn 200010 using namespace std; vector<int>G[maxn],rG[maxn]; vector<int>vs,cmp[maxn]; int vis[maxn],book[maxn],cnt,flag; void dfs(int u) { if(vis[u]) return ; vis[u]=1; for(int i=0;i<G[u].size();i++) dfs(G[u][i]); vs.push_back(u); } void rdfs(int u) { if(book[u]) return ; book[u]=cnt; if(!flag) cmp[cnt].push_back(u); for(int i=0;i<rG[u].size();i++) rdfs(rG[u][i]); } int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); G[x].push_back(y); rG[y].push_back(x); } for(int i=1;i<=n;i++) dfs(i); for(int i=n-1;i>=0;i--) { if(!book[vs[i]]) { cnt++; rdfs(vs[i]); } } flag=1; memset(book,0,sizeof(book)); rdfs(cmp[cnt][0]); for(int i=1;i<=n;i++) if(!book[i]) cmp[cnt].resize(0); printf("%d ",cmp[cnt].size()); return 0; }