#include "The-Tips.h" class DFS { public: vector < vector > Adj; vector p; vector pr; vector visited; void DoDFS(int n, int from); }; void DFS::DoDFS(int n, int from) { int j; if (visited[n]) return; p[n] += ((1 - p[n]) * pr[from]); visited[n] = 1; for (j = 0; j < Adj[n].size(); j++) { if (!visited[Adj[n][j]]) DoDFS(Adj[n][j], from); } } double TheTips::solve(vector Cl, vector probability, int print) { int i, j, v; double x; DFS D; D.Adj.resize(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') D.Adj[i].push_back(j); } D.p.resize(D.Adj.size(), 0); D.pr.resize(D.Adj.size(), 0); for (i = 0; i < D.pr.size(); i++) { D.pr[i] = probability[i]; D.pr[i] /= 100.0; } /* Print the adjacency lists before doing the DFS */ if (print) { printf("The Adjacency Lists:\n\n"); for (i = 0; i < D.Adj.size(); i++) { printf("%3d:", i); for (j = 0; j < D.Adj[i].size(); j++) printf(" %d", D.Adj[i][j]); printf("\n"); } } /* Do the DFS's */ for (v = 0; v < D.Adj.size(); v++) { D.visited.clear(); D.visited.resize(D.Adj.size(), 0); D.DoDFS(v, v); } 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 < D.Adj.size(); i++) { printf("I: %X Prob: %7.5lf\n", i, D.p[i]); } } x = 0; for (i = 0; i < D.Adj.size(); i++) x += D.p[i]; return x; }