#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5,M=1e5+1;
int h[N],h1[N],cnt0,cnt,dfn[N],low[N],scc[N],p,dp[N],sz[N],num[N],f[N];
bool vis[N],zh[N];
int n,m,ans;
stack<int>st;
struct E{
int nxt,to;
}e[M],e1[M];
void add(int u,int v)
{
e[++cnt0]=(E){h[u],v};
h[u]=cnt0;
}
void add1(int u,int v)
{
e1[++cnt0]=(E){h1[u],v};
h1[u]=cnt0;
}
void tarjan(int x)
{
dfn[x]=low[x]=++cnt;
st.push(x);
vis[x]=1;
for(int i=h[x];i;i=e[i].nxt)
{
int v=e[i].to;
if(!dfn[v])
{
tarjan(v);
low[x]=min(low[x],low[v]);
}
else if(vis[v])
low[x]=min(low[x],dfn[v]);
}
if(low[x]==dfn[x])
{
int y;
p++;
do{
y=st.top();
scc[y]=p;
sz[p]++;
vis[y]=0;
st.pop();
}while(y!=x);
}
}
queue<int>q1;
void topsort()
{
queue<int>q;
for(int i=1;i<=p;i++)
if(!num[i])
{
q1.push(i);
q.push(i);
}
while(!q.empty())
{
int f=q.front();
q.pop();
for(int i=h1[f];i;i=e1[i].nxt)
{
num[e1[i].to]--;
if(!num[e1[i].to])
{
q1.push(e1[i].to);
q.push(e1[i].to);
}
}
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
if(u!=v)
add(u,v);
else
zh[u]=1;
}
for(int i=1;i<=n+1;i++)
if(!dfn[i])
tarjan(i);
cnt0=0;
for(int i=1;i<=n+1;i++)
for(int j=h[i];j;j=e[j].nxt)
{
int v=e[j].to;
if(scc[i]!=scc[v])
{
add1(scc[v],scc[i]);
num[scc[i]]++;
}
}
topsort();
dp[scc[n+1]]=1;
while(!q1.empty())
{
int f=q1.front();
q1.pop();
for(int j=h1[f];j;j=e1[j].nxt)
{
int v=e[j].to;
dp[v]=min(36501ll,dp[v]+dp[f]);
}
}
for(int i=1;i<=n+1;i++)
{
f[i]=dp[scc[i]];
ans=max(ans,f[i]);
}
cout<<ans<<"\n";
queue<int>q2;
for(int i=1;i<=n;i++)
if(f[i]==ans)
q2.push(i);
cout<<q2.size()<<"\n";
while(!q2.empty())
{
cout<<q2.front()<<" ";
q2.pop();
}
return 0;
}
代码输出
2
1
1
样例答案
4
1
1
求条