#include<iostream>
#include<cstring>
#define maxn 50005
using namespace std;
int n,m,head[maxn],cnt;
int dfn[maxn],low[maxn],index1;
int st[maxn],top;
int vis[maxn];
int s;
int f[maxn],siz[maxn];
int num[maxn];
struct Edge{
int v,next;
}edge[maxn];
void add(int u,int v){
edge[++cnt]=(Edge){v,head[u]};
head[u]=cnt;
}
inline int read(){
int ans=0;char cc=getchar();
while ('0'>cc||cc>'9') cc=getchar();
while ('0'<=cc&&cc<='9'){
ans=(ans<<3)+(ans<<1)+cc-'0';
cc=getchar();
}
return ans;
}
void tarjan(int u){
dfn[u]=low[u]=++index1;
st[++top]=u;
vis[u]=1;
int v;
for (int i=head[u];i;i=edge[i].next){
v=edge[i].v;
if (dfn[v]==0){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if (vis[v]){
low[u]=min(low[u],dfn[v]);
}
}
int t;
if (low[u]==dfn[u]){
s++;
do {
t=st[top];
top--;
f[t]=s;
siz[s]++;
vis[t]=0;
}while (u!=t);
}
}
int main(){
n=read(),m=read();
int u,v;
for (int i=1;i<=m;i++){
u=read(),v=read();
add(u,v);
}
for (int i=1;i<=n;i++){
if (dfn[i]==0){
tarjan(i);
}
}
for (int i=1;i<=n;i++){
cout<<f[i]<<' ';
}
cout<<endl;
for (int i=1;i<=s;i++){
for (int j=head[i];j;j=edge[i].next){
if (f[i]!=f[edge[j].v]){
num[f[i]]++;
}
}
}
int ans=0;
for (int i=1;i<=s;i++){
if (!num[i]){
if (ans==0){
ans=i;
}
else {
cout<<0<<endl;
return 0;
}
}
}
cout<<siz[ans];
return 0;
}
评测记录