From eb6188d5699f2e2cd195f6c6607cb26ffd21e255 Mon Sep 17 00:00:00 2001 From: akuazzam <72036463+akuazzam@users.noreply.github.com> Date: Thu, 29 Oct 2020 00:47:11 -0500 Subject: [PATCH] Increase efficiency of cycle finding algo --- tideman.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tideman.c b/tideman.c index b537a46..2a95c10 100644 --- a/tideman.c +++ b/tideman.c @@ -14,6 +14,7 @@ bool locked[MAX][MAX]; // checks if there is a cylce in locked graph bool visited [MAX]; +bool stack [MAX]; // Each pair has a winner, loser typedef struct @@ -210,9 +211,13 @@ void swap (int i, int j) { } bool iscyclic () { + //clear visited and stack arrays for (int i = 0; i < candidate_count; i ++) { - // clear visited array - for (int k = 0; k < candidate_count; k ++) visited[k] = false; + visited[i] = false; + stack[i] = false; + } + for (int i = 0; i < candidate_count; i ++) { + if (visited[i]) continue; if (iscyclic_recur (i)) return true; } @@ -220,11 +225,13 @@ bool iscyclic () { } bool iscyclic_recur (int src) { - if (visited[src]) return true; + if (stack[src]) return true; visited[src] = true; + stack[src] = true; for (int i = 0; i < candidate_count; i ++) { if (locked[src][i] && iscyclic_recur(i)) return true; } + stack[src] = false; return false; }