public static void Main()
var nodeValues = ReadNodeValues();
var adjacencyMatrix = ReadAdjacencyMatrix();
var scores = CalculateScores(nodeValues, adjacencyMatrix);
foreach (var score in scores)
static int[] ReadNodeValues()
var input = "5 3 4 3 6 5 2 6 1 4 4 7";
static byte[][] ReadAdjacencyMatrix()
.Split(new[] { '\r', '\n'}, StringSplitOptions.RemoveEmptyEntries);
static int[] CalculateScores(int[] nodeValues, byte[][] adjacencyMatrix)
var nodesCount = nodeValues.Length;
var scores = new int[nodesCount];
var affectedNodeMatrix = BuildAffectedNodeMatrix(adjacencyMatrix);
for (var i = 0; i < nodesCount; i++)
var score = nodeValues[i];
var affectedNodes = affectedNodeMatrix[i];
for (int j = 0; j < nodesCount; j++)
if(affectedNodes[j] == 1)
static byte[][] BuildAffectedNodeMatrix(byte[][] adjacencyMatrix)
var nodesCount = adjacencyMatrix.Length;
var affectedNodeMatrix = new byte[nodesCount][];
for (int i = 0; i < nodesCount; i++)
BuildAffectedNodesForNode(i, adjacencyMatrix, affectedNodeMatrix);
return affectedNodeMatrix;
static byte[] BuildAffectedNodesForNode(int nodeIndex, byte[][] adjacencyMatrix, byte[][] affectedNodeMatrix)
var affectedNodes = affectedNodeMatrix[nodeIndex];
if (affectedNodes != null)
var adjacentNodes = adjacencyMatrix[nodeIndex];
affectedNodes = new byte[adjacentNodes.Length];
affectedNodeMatrix[nodeIndex] = affectedNodes;
for (var i = 0; i < adjacentNodes.Length; i++)
if (adjacentNodes[i] == 1)
if(affectedNodes[i] == 1)
var adjacentAffectedNodes = BuildAffectedNodesForNode(i, adjacencyMatrix, affectedNodeMatrix);
for (int j = 0; j < adjacentAffectedNodes.Length; j++)
if(adjacentAffectedNodes[j] == 1)