模板,注意有个地方打错好多次了:
for(int j = 0;j < scc[i].size();j++)——是j++不是i++!!!
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<vector> 5 using namespace std; 6 7 const int Maxn = 100010; 8 9 int ind[Maxn],dfn[Maxn],low[Maxn],stack[Maxn],ins[Maxn],inscc[Maxn]; 10 vector<int> scc[Maxn],g[Maxn]; 11 int cntscc,cntv,n,m,top; 12 13 void tarjan(int x){ 14 dfn[x] = low[x] = ++cntv; 15 ins[x] = 1,stack[++top] = x; 16 for(int i = 0;i < g[x].size();i++){ 17 int u = g[x][i]; 18 if(!dfn[u])tarjan(u),low[x] = min(low[x],low[u]); 19 else if(ins[u])low[x] = min(low[x],dfn[u]); 20 } 21 if(dfn[x] == low[x]){ 22 cntscc++; int y = -1; 23 while(y != x){ 24 y = stack[top--]; 25 ins[y] = 0; 26 inscc[y] = cntscc; 27 scc[cntscc].push_back(y); 28 } 29 } 30 } 31 32 int main(){ 33 cin >> n >> m; 34 for(int i = 1;i <= m;i++){ 35 int x,y; 36 cin >> x >> y; 37 g[x].push_back(y); 38 } 39 for(int i = 1;i <= n;i++)if(!dfn[i])tarjan(i); 40 for(int i = 1;i <= cntscc;i++){ 41 for(int j = 0;j < scc[i].size();j++){ 42 int u = scc[i][j]; 43 for(int k = 0;k < g[u].size();k++){ 44 int v = g[u][k]; 45 if(inscc[v] != i)ind[inscc[v]]++; 46 } 47 } 48 } 49 int ans = 0; 50 for(int i = 1;i <= cntscc;i++)if(!ind[i])ans++; 51 cout << ans; 52 return 0; 53 }