ICPC Latin American Regional Contests 2019 I题

只需要进行拓扑排序求一下路径总数就可以

但是我在求第二问的时候被坑了,因为我是求完之后枚举判断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;
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12663565.html