40分求助
查看原帖
40分求助
329698
youdu666楼主2022/2/8 13:03

RT,最后两个点TLE,5~7WA,动规

#include<bits/stdc++.h>
using namespace std;
int x,y,rd[5001],cd[5001],i,j,n,m,u,k;
long long dp[5001];
int rdt[5001];
long long ans;
bool cp[5001][5001];
void ql()
{
    for(int i=1;i<=n;i++)
        dp[i]=0,rdt[i]=rd[i];
    for(int i=1;i<=n;i++)
        if(rd[i]==0)
            u=i,dp[i]=1;
    return;
}
inline int read()
{
    int x=0,y=1;
    char c=getchar();
    while(c>'9'||c<'0')
    {
        if(c=='-')
            y=-1;
        c=getchar();
    }
    while(c<='9'&&c>='0')
        x=x*10+c-48,c=getchar();
    return x*y;
}
int main()
{
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        x=read(),y=read();
        cd[x]++,rd[y]++;
        cp[x][y]=1;
    }
    for(j=1;j<=n;j++)
    {
        if(cd[j]!=0)
            continue;           
        if(rd[j]==0)
        {
            ans++;
            continue;
        }
        ql();
        while(true)
        {
            for(k=1;k<=n;k++)
                if(cp[u][k]==1)
                {
                    dp[k]+=dp[u];
                    rdt[k]--;
                }
            if(u==j)
                break;
            rdt[u]=-1;
            for(k=1;k<=n;k++)
                if(rdt[k]==0)
                {
                    u=k;
                    break;
                }
        }
        ans+=dp[j];
        ans%=80112002;
    }
    cout<<ans;
    return 0;
}
2022/2/8 13:03
加载中...