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;
}