Language: C++
/* UVa 405 - Message Routing To build using Visual Studio 2012: cl -EHsc -O2 UVa_405_Message_Routing.cpp */ #include <string> #include <map> #include <cstdio> #include <cstring> using namespace std; const int M_max = 10, I_max = 9, nr_components = 4, nr_chars_max = 15; struct routing_table { int mi_; char components_[nr_components][nr_chars_max + 1]; }; struct mta { int nr_tables_; routing_table routing_tables_[I_max]; } mtas[M_max]; string mta_names[M_max]; bool routed[M_max]; int main() { int M; char s[nr_chars_max + 1]; for (int scenario_nr = 1; scanf("%d", &M) != EOF; scenario_nr++) { map<string, int> mta_name_indices; for (int i = 0; i < M; i++) { int I; scanf("%s %d", s, &I); pair<map<string, int>::iterator, bool> result = mta_name_indices.insert(make_pair(s, static_cast<int>(mta_name_indices.size()))); mta_names[result.first->second] = result.first->first; mta& m = mtas[result.first->second]; m.nr_tables_ = I; for (int j = 0; j < I; j++) { scanf("%s", s); pair<map<string, int>::iterator, bool> result = mta_name_indices.insert(make_pair(s, static_cast<int>(mta_name_indices.size()))); routing_table& r = m.routing_tables_[j]; r.mi_ = result.first->second; for (int k = 0; k < nr_components; k++) scanf("%s", &r.components_[k]); } } printf("Scenario # %d\n", scenario_nr); int N; scanf("%d", &N); for (int i = 1; i <= N; i++) { for (int j = 0; j < M; j++) routed[j] = false; routing_table r; scanf("%s", s); routed[r.mi_ = mta_name_indices[s]] = true; for (int j = 0; j < nr_components; j++) scanf("%s", &r.components_[j]); while (true) { mta& m = mtas[r.mi_]; int j; for (j = 0; j < m.nr_tables_; j++) { routing_table& mr = m.routing_tables_[j]; int k; for (k = 0; k < nr_components; k++) if (mr.components_[k][0] != '*' && strcmp(mr.components_[k], r.components_[k])) break; if (k == nr_components) // found break; } if (j < m.nr_tables_) { // found if (r.mi_ == m.routing_tables_[j].mi_) { printf("%d -- delivered to %s\n", i, mta_names[r.mi_].c_str()); break; } else if (routed[m.routing_tables_[j].mi_]) { printf("%d -- circular routing detected by %s\n", i, mta_names[m.routing_tables_[j].mi_].c_str()); break; } else routed[r.mi_ = m.routing_tables_[j].mi_] = true; } else { printf("%d -- unable to route at %s\n", i, mta_names[r.mi_].c_str()); break; } } } putchar('\n'); } return 0; }
No comments:
Post a Comment