#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 ::iterator visI; vector stack; int sp; vector::iterator Adjji; string::iterator Clij; vector::iterator Cli; vector >::iterator Adji; int visCount,tmpSP; Adj.resize(Cl.size()); stack.resize(Cl.size()); /* Change the Y/N's to 1/0's */ for (Cli = Cl.begin(), Adji = Adj.begin(); Cli < Cl.end(); ++Cli, ++Adji) { for (Clij = Cli->begin(); Clij != Cli->end(); Clij++){ if (*Clij == 'Y'){ Adji->push_back(Clij-Cli->begin()); } } } 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; visited[v] = 1; visCount = 1; while (sp != 0) { j = stack[--sp]; p[j] += ((1 - p[j])*pr[v]); if(visCount != Adj.size()){ tmpSP = sp; for (Adjji = Adj[j].begin(); Adjji != Adj[j].end(); ++Adjji) { if (!visited[*Adjji]){ visited[*Adjji] = 1; stack[sp++] = *Adjji; } } visCount += (sp-tmpSP); } } } 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; }