正反向各一次spfa,然后枚举每一条边,全wa
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#define int long long
#define MAXN 1000086
using namespace std;
int n,m,tot,xx[MAXN],yy[MAXN];
int sdn,cnt,tt,sddis[MAXN],dfn[MAXN],low[MAXN],vis[MAXN],stack[MAXN],col[MAXN];
int dis1[MAXN],dis2[MAXN];
struct node
{
int first,next,go;
}p[MAXN];
queue<int>q;
inline void star(int a,int b)
{
p[++tot].next=p[a].first;
p[a].first=tot;
p[tot].go=b;
}
inline void tarjan(int x)
{
stack[++cnt]=x;
low[x]=dfn[x]=++tt;
vis[x]=1;
for(int i=p[x].first;i;i=p[i].next)
{
int y=p[i].go;
if(!dfn[y])
{
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(vis[y]) low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x])
{
++sdn;
int v;
do
{
v=stack[cnt--];
vis[v]=0;
col[v]=sdn;
}while(v!=x);
}
}
inline void spfa(int *dis,int a)
{
dis[a]=sddis[a];
q.push(a);
while(!q.empty())
{
int x=q.front();
q.pop();
vis[x]=0;
for(int i=p[x].first;i;i=p[i].next)
{
int y=p[i].go;
if(dis[x]+sddis[y]>dis[y])
{
dis[y]=dis[x]+sddis[y];
if(!vis[y])
{
vis[y]=1;
q.push(y);
}
}
}
}
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&xx[i],&yy[i]);
star(xx[i],yy[i]);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i]) tarjan(i);
}
for(int i=1;i<=n;i++) ++sddis[col[i]];
memset(p,0,sizeof(p));
memset(vis,0,sizeof(vis));
tot=0;
for(int i=1;i<=m;i++)
{
if(col[xx[i]]!=col[yy[i]])
star(col[xx[i]],col[yy[i]]);
}
spfa(dis1,1);
memset(p,0,sizeof(p));
memset(vis,0,sizeof(vis));
tot=0;
for(int i=1;i<=m;i++)
{
if(col[xx[i]]!=col[yy[i]])
star(col[yy[i]],col[xx[i]]);
}
spfa(dis2,1);
int ans=0;
for(int i=1;i<=m;i++)
{
if(col[xx[i]]!=col[yy[i]])
{
ans=max(ans,dis1[col[xx[i]]]+dis2[col[yy[i]]]);
//printf("%lld %lld %lld %lld\n",col[yy[i]],dis1[col[yy[i]]],col[xx[i]],dis2[col[xx[i]]]);
}
}
printf("%lld",ans);
return 0;
}