学了两天的链式前向星知识,终于可以独立写出代码,想用链式前向星可以参考AC了
#include <bits/stdc++.h>
using namespace std;
const int maxN=100005;
const int maxM=200005;
int head[maxN];
int to[maxM];
int Next[maxM];
int cnt=1;
int inDeg[maxN];
int dp[maxN];
int dfs(int now,int level) {
if (dp[now]!=-1) {
return dp[now];
}
if (head[now]==0) {
if (level==1) {
return 0;
}
return 1;
}
int sum=0;
for (int i=head[now];i>0;i=Next[i]) {
sum+=dfs(to[i],level+1);
}
return dp[now]=sum;
}
void add(int u,int v) {
Next[cnt]=head[u];
to[cnt]=v;
head[u]=cnt++;
inDeg[v]++;
}
int main() {
int n,m;cin >> n >> m;
memset(dp,-1,sizeof(dp));
memset(inDeg,0,sizeof(inDeg));
memset(Next,0,sizeof(Next));
memset(to,0,sizeof(to));
while(m--) {
int u,v;cin >> u >> v;
add(u,v);
}
int cnt=0;
for(int i=1;i<=n;i++) {
if(inDeg[i]==0) {
cnt+=dfs(i,1);
}
}
cout<<cnt<<endl;
}

京公网安备 11010502036488号