#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int N=1e4+4,M=5e4+4;
int n,m,u[M],v[M],op[N],dp[N],in[N],sc=0;
vector<int>e[N],p[N];
int dfscnt=0,dfs[N],back[N],scc[N];
bool vis[N],atS[N];
inline void srh(int nk){
if(vis[nk])return;
dp[nk]=1;
vis[nk]=true;
for(int i=0;i<p[nk].size();i++){
srh(p[nk][i]);
dp[nk]+=dp[p[nk][i]];
}
}
inline void top_sort(){
memset(vis,false,sizeof(vis));
for(int i=1;i<=sc;i++)
if(in[i]==0)
srh(i);
int sum=0;
for(int i=1;i<=sc;i++){
if(dp[i]==sc)
sum+=op[i];
}
printf("%d\n",sum);
return ;
}
class STACK{
private:int ST[N],top=-1;
public:
void push(int num){ST[++top]=num;atS[num]=true;vis[num]=true;}
int tp(){return top==-1?-1e9:ST[top];}
void pop(){
if(top!=-1){
atS[ST[top]]=false;
top--;
}
}
}s;
inline void tarjan(int nk){
dfs[nk]=back[nk]=++dfscnt;
s.push(nk);
for(int i=0;i<e[nk].size();i++){
if(!vis[e[nk][i]]){
tarjan(e[nk][i]);
back[nk]=min(back[nk],back[e[nk][i]]);
}
else if(atS[e[nk][i]]){
back[nk]=min(back[nk],dfs[e[nk][i]]);
}
}
if(dfs[nk]==back[nk]){
sc++;
op[sc]=1;
while(s.tp()!=nk){
scc[s.tp()]=sc;
op[sc]++;
s.pop();
}
scc[nk]=sc;
s.pop();
}
}
inline void add(int begin,int end){
p[end].push_back(begin);
in[begin]++;
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&u[i],&v[i]);
e[u[i]].push_back(v[i]);
}
for(int i=1;i<=n;i++){
if(!vis[i])tarjan(i);
}
for(int i=1;i<=m;i++){
if(scc[u[i]]==scc[v[i]])continue;
add(scc[u[i]],scc[v[i]]);
}
top_sort();
return 0;
}
只有64分,改成
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int N=1e4+4,M=5e4+4;
int n,m,u[M],v[M],op[N],dp[N],in[N],sc=0;
vector<int>e[N],p[N];
int dfscnt=0,dfs[N],back[N],scc[N];
bool vis[N],atS[N];
inline void srh(int nk){
if(vis[nk])return;
dp[nk]=1;
vis[nk]=true;
for(int i=0;i<p[nk].size();i++){
srh(p[nk][i]);
dp[nk]+=dp[p[nk][i]];
}
}
inline void top_sort(){
memset(vis,false,sizeof(vis));
for(int i=1;i<=sc;i++)
if(!vis[i])
srh(i);
int sum=0;
for(int i=1;i<=sc;i++){
if(dp[i]>=sc)
sum+=op[i];
}
printf("%d\n",sum);
return ;
}
class STACK{
private:int ST[N],top=-1;
public:
void push(int num){ST[++top]=num;atS[num]=true;vis[num]=true;}
int tp(){return top==-1?-1e9:ST[top];}
void pop(){
if(top!=-1){
atS[ST[top]]=false;
top--;
}
}
}s;
inline void tarjan(int nk){
dfs[nk]=back[nk]=++dfscnt;
s.push(nk);
for(int i=0;i<e[nk].size();i++){
if(!vis[e[nk][i]]){
tarjan(e[nk][i]);
back[nk]=min(back[nk],back[e[nk][i]]);
}
else if(atS[e[nk][i]]){
back[nk]=min(back[nk],dfs[e[nk][i]]);
}
}
if(dfs[nk]==back[nk]){
sc++;
op[sc]=1;
while(s.tp()!=nk){
scc[s.tp()]=sc;
op[sc]++;
s.pop();
}
scc[nk]=sc;
s.pop();
}
}
inline void add(int begin,int end){
p[end].push_back(begin);
in[begin]++;
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&u[i],&v[i]);
e[u[i]].push_back(v[i]);
}
for(int i=1;i<=n;i++){
if(!vis[i])tarjan(i);
}
for(int i=1;i<=m;i++){
if(scc[u[i]]==scc[v[i]])continue;
add(scc[u[i]],scc[v[i]]);
}
top_sort();
return 0;
}
后为什么就AC了?