震驚!記憶化搜索忘記返回map值調了半小時!
邊(u,v)的通過次數是:能到u的牛數*v到n的方案數。正反兩次連邊,dfs兩次便可ios
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=5005,M=50005; int n,m,x[M],y[M],h[N],cnt,ans,f[N],g[N]; struct qwe { int ne,to; }e[M]; int read() { int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f; } void add(int u,int v) { cnt++; e[cnt].ne=h[u]; e[cnt].to=v; h[u]=cnt; } int dfs1(int u) { if(!h[u]) f[u]=1; if(f[u]!=0) return f[u]; for(int i=h[u];i;i=e[i].ne) f[u]+=dfs1(e[i].to); return f[u]; } int dfs2(int u) { if(!h[u]) g[u]=1; if(g[u]!=0) return g[u]; for(int i=h[u];i;i=e[i].ne) g[u]+=dfs2(e[i].to); return g[u]; } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { x[i]=read(),y[i]=read(); add(x[i],y[i]); } for(int i=1;i<=n;i++) if(!f[i]) dfs1(i); memset(h,0,sizeof(h)); cnt=0; for(int i=1;i<=m;i++) add(y[i],x[i]); dfs2(n); for(int i=1;i<=m;i++) ans=max(ans,g[x[i]]*f[y[i]]); printf("%d\n",ans); return 0; }