If the loser can already reach the winner through existing locked links, locking this pair will create a loop. If a loop is detected, skip the pair. 6. print_winner
The beginning is deceptively easy. You have to record preferences. If Alice beats Bob, Alice gets a point. Simple array work. I thought, "Hey, this isn't so bad."
// Functions to implement bool vote(int rank, string name, int ranks[]); void record_preferences(int ranks[]); void add_pairs(void); void sort_pairs(void); void lock_pairs(void); void print_winner(void);
The Tideman solution involves the following steps:
string candidates[MAX]; pair pairs[MAX * (MAX - 1) / 2];
In your cycle checker, make sure the loop explores all branches originating from a candidate, rather than stopping after checking just the first connected node.
if (locked[start][i] && creates_cycle(i, end)) return true;
The vote function validates a voter's rank choice. It checks if the name entered matches a valid candidate and updates the ranks array to record the voter's preference order.
We need to populate the global pairs array. A pair exists if preferences[i][j] > preferences[j][i] . If equal (tie), skip.
Run check50 to verify your implementation:
// Returns true if there is a path from start to end in locked graph bool creates_cycle(int start, int end)
If you would like to dive deeper into a specific part of the implementation, let me know. I can help you map out the , explain how to optimize your sorting algorithm , or walk through a trace example of a voting matrix . Share public link
The algorithm creates a list of all head-to-head matchups and sorts them in descending order based on the strength of the victory.
But in step 3: Current locked: A→B, B→C. We want to lock C→A. Check if from loser (A? no, loser = A) wait, pair = (C, A): winner = C, loser = A. Check if there’s a path from loser (A) to winner (C) using current locked edges. A→B→C? Yes! So cycle would form → don’t lock.