//poj 3272
//sep9
#include <iostream>
using namespace std;
const int MAXN=5012;
const int MAXM=50012;
int n,m,e,rev_e;
int head[MAXN],rev_head[MAXN],flag[MAXN],dp[MAXN],rev_dp[MAXN];
struct EDGE{
int v,next;
}edge[MAXM],rev_edge[MAXM];
int main()
{
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
memset(rev_head,-1,sizeof(rev_head));
rev_e=e=0;
memset(flag,0,sizeof(flag));
while(m--){
int u,v;
scanf("%d%d",&u,&v);
edge[e].v=v,edge[e].next=head[u],head[u]=e++;
rev_edge[rev_e].v=u,rev_edge[rev_e].next=rev_head[v],rev_head[v]=rev_e++;
flag[v]=1;
}
memset(dp,0,sizeof(dp));
memset(rev_dp,0,sizeof(rev_dp));
dp[n]=1;
for(int u=n-1;u>=1;--u)
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
dp[u]+=dp[v];
}
for(int u=1;u<=n;++u)
if(!flag[u])
rev_dp[u]=1;
else{
for(int i=rev_head[u];i!=-1;i=rev_edge[i].next){
int v=rev_edge[i].v;
rev_dp[u]+=rev_dp[v];
}
}
int maxx=-1;
for(int u=1;u<=n;++u)
for(int i=head[u];i!=-1;i=edge[i].next)
maxx=max(maxx,rev_dp[u]*dp[edge[i].v]);
printf("%d",maxx);
return 0;
}
poj 3272 Cow Traffic dag上的dp
最新推荐文章于 2020-05-15 15:31:53 发布