#include "The-Tips.h" double TheTips::solve(vector Cl, vector probability, int print) { int i, j, v; vector < vector > Adj; vector p; vector pr; double x; vector visited; vector stack; int sp; Adj.resize(Cl.size()); stack.resize(Cl.size()*Cl.size()); /* Change the Y/N's to 1/0's */ for (i = 0; i < Cl.size(); i++) { for (j = 0; j < Cl.size(); j++) if (Cl[i][j] == 'Y') Adj[i].push_back(j); } p.resize(Adj.size(), 0); pr.resize(Adj.size(), 0); for (i = 0; i < pr.size(); i++) { pr[i] = probability[i]; pr[i] /= 100.0; } /* Print the adjacency lists before doing the DFS */ if (print) { printf("The Adjacency Lists:\n\n"); for (i = 0; i < Adj.size(); i++) { printf("%3d:", i); for (j = 0; j < Adj[i].size(); j++) printf(" %d", Adj[i][j]); printf("\n"); } } /* Do the DFS's -- just manage a stack */ for (v = 0; v < Adj.size(); v++) { sp = 0; visited.clear(); visited.resize(Adj.size(), 0); stack[sp++] = v; while (sp != 0) { j = stack[--sp]; if (!visited[j]) { visited[j] = 1; p[j] += ((1 - p[j])*pr[v]); for (i = 0; i < Adj[j].size(); i++) { if (!visited[Adj[j][i]]) stack[sp++] = Adj[j][i]; } } } } if (print) { printf("Probabilities:\n\n"); for (i = 0; i < probability.size(); i++) printf("%4d", probability[i]); printf("\n\nThe Expected Values\n\n"); for (i = 0; i < Adj.size(); i++) { printf("I: %X Prob: %7.5lf\n", i, p[i]); } } x = 0; for (i = 0; i < Adj.size(); i++) x += p[i]; return x; }