n个点m条有向边,求在入度为零的点到n号点的所有路 //径中,哪条边被这些路径覆盖的次数最多
1 //n个点m条有向边,求在入度为零的点到n号点的所有路 2 //径中,哪条边被这些路径覆盖的次数最多 3 //有关DAG的知识,先记个模板 4 #include<iostream> 5 #include<cstdio> 6 #include<cstring> 7 #include<algorithm> 8 using namespace std; 9 typedef long long ll; 10 const int maxn=5e3+10; 11 const int maxm=5e4+10; 12 struct node 13 { 14 int v; 15 int next; 16 ll cnt; 17 }edge[maxm],Edge[maxm]; 18 int head[maxn]; 19 int HEAD[maxn]; 20 int cnt; 21 ll f[maxn],g[maxn]; 22 int id[maxn],od[maxn]; 23 void add(int u,int v) 24 { 25 ++cnt; 26 edge[cnt].v=v; 27 edge[cnt].next=head[u]; 28 head[u]=cnt; 29 Edge[cnt].v=u; 30 Edge[cnt].next=HEAD[v]; 31 HEAD[v]=cnt; 32 } 33 int main() 34 { 35 int i,j,n,m,v; 36 scanf("%d%d",&n,&m); 37 int a,b; 38 for( i=1;i<=m;i++){ 39 scanf("%d%d",&a,&b); 40 add(a,b); 41 id[b]++; od[a]++; 42 } 43 for(int i=1;i<=n;i++){ 44 if(!id[i]) f[i]=1; 45 if(!od[i]) g[i]=1; 46 } 47 for(i=1;i<=n;i++){ 48 for(j=head[i];j;j=edge[j].next){ 49 v=edge[j].v; 50 f[v]+=f[i]; 51 edge[j].cnt+=f[i]; 52 } 53 } 54 for(j=n;j>=1;j--){ 55 for(i=HEAD[j];i;i=Edge[i].next){ 56 v=Edge[i].v; 57 g[v]+=g[j]; 58 Edge[i].cnt+=g[j]; 59 } 60 } 61 ll ans=0; 62 for(i=1;i<=m;i++) 63 ans=max(ans,edge[i].cnt*Edge[i].cnt); 64 printf("%lld\n",ans); 65 return 0; 66 }