设f[u]为从度数0到u的路径条数,f2[u]为从u到n的路径条数。
ans=max{f[x[i]]*f2[y[i]]}(1<=i<=m)。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define N 5001 typedef long long ll; #define M 50001 int e,v[M],first[N],next[M]; void AddEdge(int U,int V) { v[++e]=V; next[e]=first[U]; first[U]=e; } ll f[N],f2[N]; int ru[N],m,n; int x[M],y[M]; ll ans; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;++i) { scanf("%d%d",&x[i],&y[i]); ++ru[y[i]]; AddEdge(y[i],x[i]); } for(int i=1;i<=n;++i) if(!ru[i]) f[i]=1; for(int i=1;i<=n;++i) for(int j=first[i];j;j=next[j]) f[i]+=f[v[j]]; e=0; memset(first+1,0,sizeof(int)*n); for(int i=1;i<=m;++i) AddEdge(x[i],y[i]); f2[n]=1; for(int i=n;i;--i) for(int j=first[i];j;j=next[j]) f2[i]+=f2[v[j]]; for(int i=1;i<=m;++i) ans=max(ans,f[x[i]]*f2[y[i]]); printf("%d ",ans); return 0; }