function part2(input) {
const maxT = 26;
const network = removeZeroValves(input);
const costs = network.graph.costMatrix();
const scores = new Map();
const seqs = findSeqs(
network,
network.graph.nodes().filter((v) => v !== "AA"),
costs,
maxT
).map((seq) => [seq, calcScore(seq, costs, network.valves, maxT)]);
for (const [seq, score] of seqs) {
const key = seq.sort().join(",");
scores.set(key, Math.max(score, scores.get(key) || 0));
}
const sortedSeqs = [...scores.keys()].map((str) => str.split(","));
let maxScore = 0;
for (let i = 0; i < sortedSeqs.length; i++) {
for (let j = i + 1; j < sortedSeqs.length; j++) {
let [seq1, seq2] = [sortedSeqs[i], sortedSeqs[j]];
let [areDisjoint, p1, p2] = [true, 0, 0];
while (p1 < seq1.length && p2 < seq2.length) {
if (seq1[p1] === seq2[p2]) {
areDisjoint = false;
break;
}
seq1[p1] < seq2[p2] ? p1++ : p2++;
}
if (areDisjoint) {
maxScore = Math.max(
maxScore,
scores.get(seq1.join(",")) + scores.get(seq2.join(","))
);
}
}
}
return maxScore;
}