Ranking (as of 2014-08-22): 224 out of 681
Language: C++
/* UVa 452 - Project Scheduling To build using Visual Studio 2012: cl -EHsc -O2 UVa_452_Project_Scheduling.cpp */ #include <iostream> #include <string> #include <sstream> #include <queue> #include <algorithm> #include <cstring> using namespace std; const int nr_vertices = 26; int nr_days[nr_vertices], nr_accumulated_days[nr_vertices], in_degrees[nr_vertices]; bool adjacency_matrix[nr_vertices][nr_vertices]; int main() { string line; istringstream iss; getline(cin, line); iss.str(line); int nr_cases; iss >> nr_cases; iss.clear(); getline(cin, line); // skip a blank line while (nr_cases--) { memset(adjacency_matrix, 0, sizeof(adjacency_matrix)); memset(nr_days, 0, sizeof(nr_days)); while (getline(cin, line) && !line.empty()) { iss.str(line); char c; int d; iss >> c >> d; int u = c - 'A'; nr_days[u] = d; while (iss >> c) adjacency_matrix[c - 'A'][u] = true; iss.clear(); } memset(in_degrees, 0, sizeof(in_degrees)); for (int u = 0; u < nr_vertices; u++) for (int v = 0; v < nr_vertices; v++) if (adjacency_matrix[u][v]) in_degrees[v]++; memset(nr_accumulated_days, 0, sizeof(nr_accumulated_days)); queue<int> q; for (int u = 0; u < nr_vertices; u++) if (nr_days[u] && !in_degrees[u]) { nr_accumulated_days[u] = nr_days[u]; q.push(u); } while (!q.empty()) { int u = q.front(); q.pop(); for (int v = 0; v < nr_vertices; v++) if (adjacency_matrix[u][v]) { nr_accumulated_days[v] = max(nr_accumulated_days[v], nr_accumulated_days[u] + nr_days[v]); #ifdef DEBUG cout << static_cast<char>(v + 'A') << ": " << nr_accumulated_days[v] << endl; #endif if (!--in_degrees[v]) q.push(v); } } int max_nr_accumulated_days = 0; for (int u = 0; u < nr_vertices; u++) max_nr_accumulated_days = max(max_nr_accumulated_days, nr_accumulated_days[u]); cout << max_nr_accumulated_days << endl; if (nr_cases) cout << endl; } return 0; }
No comments:
Post a Comment