const
int V =
10010;
int g[V][V],
order[V], inv[V], tag[V];
void mcs(
int n)
{
int i, j, k;
memset(tag,
0, sizeof(tag));
memset(
order, -
1, sizeof(
order));
for (i = n -
1; i >=
0; i--)
{
for (j =
0;
order[j] >=
0; j++);
for (k = j +
1; k < n; k++)
{
if (
order[k] <
0 && tag[k] > tag[j])
{
j = k;
}
}
order[j] = i, inv[i] = j;
for (k =
0; k < n; k++)
{
if (g[j][k])
{
tag[k]++;
}
}
}
return ;
}
int peo(
int n)
{
int i, j, k, w, min;
for (i = n -
2; i >=
0; i--)
{
j = inv[i], w = -
1, min = n;
for (k =
0; k < n; k++)
{
if (g[j][k] &&
order[k] >
order[j] &&
order[k] < min)
{
min =
order[k], w=k;
}
}
if (w <
0)
{
continue;
}
for (k =
0; k < n; k++)
{
if (g[j][k] &&
order[k] >
order[w] && !g[k][w])
{
return 0;
}
}
}
return 1;
}