#include <iostream>
#include <vector>
using namespace std;
#define MAXN 1000+1
bool f[MAXN][MAXN]={0};
bool visited[MAXN]={0};
vector<int> d[MAXN];
int t;
void dfs(int k)
{
f[t][k]=f[k][t]=visited[k]=1;
for(int j=0;j<d[k].size();j++)
if(!visited[d[k][j]])
dfs(d[k][j]);
}
int main()
{
int n,m;
int a,b;
int i,j;
int sum;
int count=0;
cin>>n>>m;
while(m--)
{
cin>>a>>b;
d[a].push_back(b);
}
for(i=1;i<=n;i++)
f[i][i]=1;
for(i=1;i<=n;i++)
{
t=i;
for(j=1;j<=n;j++)
visited[j]=0;
dfs(t);
}
for(i=1;i<=n;i++)
{
sum=0;
for(j=1;j<=n;j++)
if(f[i][j])
sum++;
if(sum==n)
count++;
}
cout<<count<<endl;
}
时间复杂度的问题。每次等于从一个点开始一条路走到底,每从一个点开始将visited置0,防止中间有循环再重复计算,把所有点计算完即可。路径记忆很关键。