#include <bits/stdc++.h>
#include <iostream>
using
namespace
std;
int
dfs(vector<vector<
int
> >& graph, vector<
bool
>& visited,
int
node)
{
visited[node] =
true
;
int
no_of_nodes = 1;
for
(
int
neighbor : graph[node]) {
if
(!visited[neighbor]) {
no_of_nodes += dfs(graph, visited, neighbor);
}
}
return
no_of_nodes;
}
int
getGCD(
int
i1,
int
i2)
{
if
(i1 == i2)
return
i1;
if
(i1 > i2)
return
getGCD(i1 - i2, i2);
return
getGCD(i1, i2 - i1);
}
string getRatio(
int
duplets,
int
triplets)
{
int
gcd = getGCD(duplets, triplets);
int
d1 = duplets / gcd;
int
d2 = triplets / gcd;
string ans =
""
;
ans = to_string(d1) +
" : "
+ to_string(d2);
return
ans;
}
string findRatio(
int
n, vector<vector<
int
> > edges)
{
vector<vector<
int
> > graph;
for
(
int
i = 0; i < n; i++) {
graph.push_back({});
}
for
(
int
i = 0; i < edges.size(); i++) {
int
x = edges[i][0];
int
y = edges[i][1];
graph[x].push_back(y);
graph[y].push_back(x);
}
int
duplets = 0, triplets = 0;
vector<
long
long
> temp;
vector<
bool
> vis(n,
false
);
for
(
int
i = 0; i < n; i++) {
if
(vis[i] ==
false
) {
int
no_of_nodes = dfs(graph, vis, i);
if
(no_of_nodes == 2) {
duplets++;
}
else
if
(no_of_nodes == 3) {
triplets++;
}
}
}
string ans =
""
;
if
(duplets == 0 && triplets == 0) {
ans =
"0 : 0"
;
}
else
if
(triplets == 0) {
ans = to_string(duplets) +
" : 0"
;
}
else
if
(duplets == 0) {
ans =
"0 : "
+ to_string(triplets);
}
else
{
ans = getRatio(duplets, triplets);
}
return
ans;
}
int
main()
{
vector<vector<
int
> > edges{
{ 0, 1 }, { 1, 3 }, { 2, 6 }, { 2, 5 }, { 6, 11 }, { 11, 5 }, { 7, 9 }, { 8, 4 }, { 8, 10 }
};
int
n = 12;
string ans = findRatio(n, edges);
cout <<
"Ratio is = "
<< ans << endl;
return
0;
}