Cs50 Tideman Solution <FHD - 4K>
She stared at her lock_pairs function. It was midnight. Her screen showed the dreaded red “:(” from check50 .
// Returns true if adding edge winner->loser creates a cycle bool creates_cycle(int winner, int loser) { // If the loser can reach the winner through existing locked edges, // then adding winner->loser would complete a cycle. return dfs(loser, winner); } bool dfs(int current, int target) { if (current == target) return true; for (int i = 0; i < candidate_count; i++) { if (locked[current][i] && dfs(i, target)) return true; } return false; }
Every year, the village of Coderidge held an election for the Keeper of the Orchard. Unlike other villages, they used a complex ranked voting system designed by a long-dead mathematician named Tideman. The rule was simple: if there was a way to trace a circle of preference (A beats B, B beats C, C beats A), that circle was a paradox, and the weakest link in that circle must be ignored. Cs50 Tideman Solution
Her job was to "lock in" the strongest edges of victory to create a directed graph of the winner—without creating a cycle.
He drew on the whiteboard:
"Show me your cycle detection," Kai said.
Maya was the new programmer tasked with tabulating the votes. She had the first part down: counting each ballot to build a 2D array of preferences . It told her that Alice beat Bob (5 votes to 2), Bob beat Charlie (4 to 3), and Charlie beat Alice (3 to 2). A perfect, frustrating cycle. She stared at her lock_pairs function
Maya pointed. "I wrote a recursive function creates_cycle(winner, loser) . It checks if the loser has any locked edges pointing to another candidate. Then it checks if that candidate points back to the original winner. If yes, it’s a cycle."