using
System;
using
System.Collections;
using
System.Collections.Generic;
class
GFG{
static
void
depthFirst(
int
v,
ArrayList graph,
bool
[] visited,
ArrayList storeChain)
{
visited[v] =
true
;
storeChain.Add(v);
foreach
(
int
i
in
(ArrayList)graph[v])
{
if
(visited[i] ==
false
)
{
depthFirst(i, graph, visited,
storeChain);
}
}
}
static
int
decimal_t(
int
[]arr,
int
n)
{
int
zeros = 0, ones = 0;
for
(
int
i = 0; i < n; i++)
{
if
(arr[i] == 0)
zeros++;
else
ones++;
}
if
(zeros == n)
return
0;
int
temp = n - ones;
int
dec = 0;
while
(ones > 0)
{
dec += (
int
)Math.Pow(2, temp);
temp++;
ones--;
}
return
dec;
}
static
void
decimal_tValue(ArrayList graph,
int
vertices,
ArrayList values)
{
bool
[] visited =
new
bool
[10001];
int
maxDeci = -100000000;
for
(
int
i = 1; i <= vertices; i++)
{
if
(visited[i] ==
false
)
{
int
sizeChain;
int
tempDeci;
ArrayList storeChain =
new
ArrayList();
depthFirst(i, graph, visited,
storeChain);
sizeChain = storeChain.Count;
int
[] chainValues =
new
int
[sizeChain + 1];
for
(
int
j = 0; j < sizeChain; j++)
{
int
temp = (
int
)values[(
int
)storeChain[j] - 1];
chainValues[j] = temp;
}
tempDeci = decimal_t(chainValues, sizeChain);
if
(tempDeci > maxDeci)
{
maxDeci = tempDeci;
}
}
}
Console.WriteLine(maxDeci);
}
public
static
void
Main(
string
[] args)
{
ArrayList graph =
new
ArrayList();
for
(
int
i = 0; i < 1001; i++)
graph.Add(
new
ArrayList());
int
V = 7;
ArrayList values =
new
ArrayList();
values.Add(0);
values.Add(1);
values.Add(0);
values.Add(0);
values.Add(0);
values.Add(1);
values.Add(1);
((ArrayList)graph[1]).Add(2);
((ArrayList)graph[2]).Add(1);
((ArrayList)graph[3]).Add(4);
((ArrayList)graph[4]).Add(3);
((ArrayList)graph[4]).Add(5);
((ArrayList)graph[5]).Add(4);
((ArrayList)graph[6]).Add(7);
((ArrayList)graph[7]).Add(6);
decimal_tValue(graph, V, values);
}
}