using
System;
using
System.Collections.Generic;
class
Solution {
static
int
flag = 0;
static
void
dfs(Tuple<
int
,
int
> v, Tuple<
int
,
int
> prev,
List<List<List<Tuple<
int
,
int
> > > > adj,
List<List<
int
> > vis)
{
vis[v.Item1][v.Item2] = 1;
foreach
(
var
u
in
adj[v.Item1][v.Item2])
{
if
(vis[u.Item1][u.Item2] == 0) {
dfs(u, v, adj, vis);
}
else
if
(!prev.Equals(u)) {
flag = 1;
return
;
}
}
}
static
int
countCycles(
int
N,
int
[, ] A,
int
M)
{
var
adj =
new
List<List<List<Tuple<
int
,
int
> > > >(
N + 1);
for
(
int
i = 0; i <= N; i++) {
adj.Add(
new
List<List<Tuple<
int
,
int
> > >() {
new
List<Tuple<
int
,
int
> >(),
new
List<Tuple<
int
,
int
> >()
});
}
for
(
int
i = 1; i <= N; i++) {
adj[i][0].Add(Tuple.Create(i, 1));
adj[i][1].Add(Tuple.Create(i, 0));
}
for
(
int
i = 0; i < M; i++) {
adj[A[i, 0]][A[i, 1]].Add(
Tuple.Create(A[i, 2], A[i, 3]));
adj[A[i, 2]][A[i, 3]].Add(
Tuple.Create(A[i, 0], A[i, 1]));
}
int
ans = 0;
var
vis =
new
List<List<
int
> >();
for
(
int
i = 0; i <= N; i++) {
vis.Add(
new
List<
int
>() { 0, 0 });
}
for
(
int
i = 1; i <= N; i++) {
if
(vis[i][0] == 0) {
dfs(Tuple.Create(i, 0),
Tuple.Create(-1, -1), adj, vis);
ans += flag;
flag = 0;
}
}
return
ans;
}
static
void
Main()
{
int
N = 5;
int
[, ] A = { { 3, 0, 5, 1 },
{ 5, 0, 3, 1 },
{ 4, 0, 2, 1 } };
int
M = 3;
Console.WriteLine(countCycles(N, A, M));
int
N1 = 5;
int
[, ] A1 = {};
int
M1 = 0;
Console.WriteLine(countCycles(N1, A1, M1));
}
}