只需要进行拓扑排序求一下路径总数就可以
但是我在求第二问的时候被坑了,因为我是求完之后枚举判断f[i]也就是到这个点的路径是否为0来判断是否到达
但是忽略了一种极端情况,也就是当次数是模数的整数倍的时候,答案经过取余后等于0,但这其实是已经到达了的
太坑了,刚开始真的没想到。
#include<iostream> #include<cstring> #include<cstdio> #include<map> #include<algorithm> #include<queue> #include<set> #define ull unsigned long long using namespace std; typedef long long ll; const int N=2005; const int mod=1e9+7; int a[N]; ll f[N]; int vis[2005]; ll in[N]; vector<ll> g[N]; ll ans; ll n; ll l; void topo(){ vis[1]=1; queue<ll> q; int i; for(i=1;i<=l;i++){ if(!in[i]) q.push(i); } while(q.size()){ ll u=q.front(); q.pop(); int i; for(i=0;i<g[u].size();i++){ ll t=g[u][i]; in[t]--; if(!in[t]) q.push(t); f[t]=(f[t]+f[u])%mod; if(vis[u])vis[t]=1; } } } int main(){ int i; cin>>n>>l; for(i=1;i<=l;i++){ int k; cin>>k;ll u; for(int j=1;j<=k;j++){ scanf("%lld",&u); g[i].push_back(u); in[u]++; } } f[1]=1; topo(); ll res=0; for(i=l+1;i<=n;i++){ ans=(ans+f[i])%mod; if(vis[i]){ res=(res+1)%mod; } } cout<<ans<<" "<<res<<endl; }