Ranking (as of 2015-05-11): 190 out of 386
Language: C++
/* UVa 334 - Identifying Concurrent Events To build using Visual Studio 2012: cl -EHsc -O2 UVa_334_Identifying_Concurrent_Events.cpp */ #include <iostream> #include <string> #include <vector> #include <map> #include <set> using namespace std; int main() { for (int case_nr = 1; ; case_nr++) { int n = 0, N, NC, NM; cin >> NC; if (!NC) break; vector<string> names; map<string, int> name_indices; set< pair<int, int> > edges; while (NC--) { cin >> N; for (int i = 0; i < N; i++) { string s; cin >> s; names.push_back(s); name_indices.insert(make_pair(s, n)); if (i) edges.insert(make_pair(n - 1, n)); n++; } } cin >> NM; while (NM--) { string s, r; cin >> s >> r; edges.insert(make_pair(name_indices[s], name_indices[r])); } vector< vector<bool> > matrix(n, vector<bool>(n, false)); for (set< pair<int, int> >::const_iterator ei = edges.begin(), ee = edges.end(); ei != ee; ++ei) matrix[ei->first][ei->second] = true; #ifdef DEBUG for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) cout << matrix[i][j] << ((j < n - 1) ? ' ' : '\n'); #endif // apply Warshall's Transitive Closure algorithm for (int k = 0; k < n; k++) for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) matrix[i][j] = matrix[i][j] || matrix[i][k] && matrix[k][j]; int nr_events = n * (n - 1) / 2; for (int i = 0; i < n - 1; i++) for (int j = i + 1; j < n; j++) if (matrix[i][j] || matrix[j][i]) nr_events--; cout << "Case " << case_nr << ", "; if (nr_events) { cout << nr_events << " concurrent events:\n"; if (nr_events > 2) nr_events = 2; for (int i = 0; i < n - 1 && nr_events; i++) for (int j = i + 1; j < n && nr_events; j++) if (!matrix[i][j] && !matrix[j][i]) { nr_events--; cout << '(' << names[i] << ',' << names[j] << ") "; } cout << endl; } else cout << "no concurrent events.\n"; } return 0; }
No comments:
Post a Comment