#include #include #include #include #include #include using namespace std; class Vertex { public: int visited; vector adj; }; class Alarmed { public: int TestA(double A); vector X; vector Y; vector T; vector V; void DFS(int n); double noise(vector x, vector y, vector threshold); }; void Alarmed::DFS(int n) { int i; if (V[n].visited) return; V[n].visited = 1; for (i = 0; i < V[n].adj.size(); i++) DFS(V[n].adj[i]); } int Alarmed::TestA(double A) { int lw, rw; int i, j; vector Radius; double d; int intersect; V.clear(); V.resize(X.size()+2); lw = X.size(); rw = X.size()+1; for (i = 0; i < X.size(); i++) { Radius.push_back(sqrt(A/T[i])); } for (i = 0; i < X.size(); i++) { for (j = 0; j < i; j++) { d = sqrt(((X[i] - X[j])*(X[i]-X[j]))+ ((Y[i] - Y[j])*(Y[i]-Y[j]))); if (d <= Radius[i]+Radius[j]) { V[i].adj.push_back(j); V[j].adj.push_back(i); } } /* Check for edge to "Left" */ intersect = 0; if (X[i] <= Radius[i]) intersect = 1; /* Intersect with left wall */ /* Intersect with top or bottom wall, left: */ if (X[i] <= 50 && (Y[i] <= Radius[i] || Y[i]+Radius[i] >= 100)) intersect = 1; if (X[i] > 50) { /* Check to see if either door is in the circle */ d = sqrt((X[i]-50)*(X[i]-50)+(Y[i]*Y[i])); if (d <= Radius[i]) intersect = 1; d = sqrt((X[i]-50)*(X[i]-50)+((100-Y[i])*(100-Y[i]))); if (d <= Radius[i]) intersect = 1; } if (intersect) { V[lw].adj.push_back(i); V[i].adj.push_back(lw); } /* Check for edge to "Right" */ intersect = 0; if ((100-X[i]) <= Radius[i]) intersect = 1; if (X[i] >= 50 && (Y[i] <= Radius[i] || Y[i]+Radius[i] >= 100)) intersect = 1; if (X[i] < 50) { d = sqrt((50-X[i])*(50-X[i])+(Y[i]*Y[i])); if (d <= Radius[i]) intersect = 1; d = sqrt((50-X[i])*(50-X[i])+((100-Y[i])*(100-Y[i]))); if (d <= Radius[i]) intersect = 1; } if (intersect) { V[rw].adj.push_back(i); V[i].adj.push_back(rw); } } for (i = 0; i < V.size(); i++) V[i].visited = 0; DFS(lw); return (V[rw].visited); } double Alarmed::noise(vector x, vector y, vector threshold) { int i; double A; for (i = 0; i < x.size(); i++) { X.push_back(x[i]); Y.push_back(y[i]); T.push_back(threshold[i]); } cout << "Enter A: "; cin >> A; i = TestA(A); printf("%d\n", i); return 0; }