#include <stdio.h>
#include <string.h>
#define VM 1005
#define EM 6005
struct E
{
to,next;
}edge[EM];
struct E1
{
frm,to,next;
}edge1[EM];
int head[VM],head1[VM],indeg[VM],map[VM][VM];
int dfn[VM],low[VM],vis[VM],belong[VM],stack[VM];
int scc,cnt,top,p,n;
void addedge (int cu,int cv)
{
cv;
= head[cu];
p++;
}
void addedge1(int cu,int cv)
{
= cu;
= cv;
edge1[p].next = head1[cu];
p ++;
}
void tarjan (int u)
{
low[u] = ++cnt;
= u;
1;
head[u];i != -1;i = edge[i].next)
v = edge[i].to;
if (!dfn[v])
{
tarjan(v);
low[u] = low[u] > low[v]?low[v]:low[u];
}
else if (vis[v]&&low[u]
> dfn[v])
low[u] = dfn[v];
== low[u])
++scc;
do
{
v = stack[--top];
vis[v] = 0;
belong[v] = scc;
} while (u != v);
}
void sovle ()
{
cnt = 0;
(dfn,0,sizeof(dfn));
(vis,0,sizeof(vis));
<= n;u ++)
if (!dfn[u])
tarjan(u);
}
int topo ()
{
u,v,i,cur,count = 0;;
<= scc;u ++)
if (!indeg[u])
{