using
System;
using
System.Collections.Generic;
class
Program
{
static
void
DFS(List<
int
>[] g,
int
[] vis,
int
[] odd,
int
[] deg,
int
comp,
int
v)
{
vis[v] = 1;
if
(deg[v] % 2 == 1)
odd[comp]++;
foreach
(
var
u
in
g[v])
if
(vis[u] == 0)
DFS(g, vis, odd, deg, comp, u);
}
static
int
MinEdge(
int
n,
int
m,
int
[] s,
int
[] d)
{
List<
int
>[] g =
new
List<
int
>[n + 1];
List<
int
> e =
new
List<
int
>();
List<
int
> o =
new
List<
int
>();
for
(
int
i = 0; i < n + 1; i++)
g[i] =
new
List<
int
>();
int
[] deg =
new
int
[n + 1];
int
[] vis =
new
int
[n + 1];
int
[] odd =
new
int
[n + 1];
Array.Fill(deg, 0);
Array.Fill(vis, 0);
Array.Fill(odd, 0);
for
(
int
i = 0; i < m; i++)
{
g[s[i]].Add(d[i]);
g[d[i]].Add(s[i]);
deg[s[i]]++;
deg[d[i]]++;
}
int
ans = 0, comp = 0;
for
(
int
i = 1; i <= n; i++)
{
if
(vis[i] == 0)
{
comp++;
DFS(g, vis, odd, deg, comp, i);
if
(odd[comp] == 0)
e.Add(comp);
else
o.Add(comp);
}
}
if
(o.Count == 0 && e.Count == 1)
return
0;
if
(o.Count == 0)
return
e.Count;
if
(e.Count != 0)
ans += e.Count;
foreach
(
var
i
in
o)
ans += odd[i] / 2;
return
ans;
}
static
void
Main(
string
[] args)
{
int
n = 3, m = 2;
int
[] source = { 1, 2 };
int
[] destination = { 2, 3 };
Console.WriteLine(MinEdge(n, m, source, destination));
}
}