#include using namespace std; struct Node { string id; int estimated_risk; int real_risk; vector neighbors; }; void calculateRealRisk(unordered_map& network) { queue q; unordered_map processed; // Initialize queue with all nodes for (auto& [id, node] : network) { q.push(id); node.real_risk = node.estimated_risk; } // Process nodes iteratively while (!q.empty()) { string current = q.front(); q.pop(); Node& curNode = network[current]; int max_risk = curNode.estimated_risk; for (const string& neighbor : curNode.neighbors) { Node& adjNode = network[neighbor]; int adj_real_risk = processed[neighbor] ? adjNode.real_risk : adjNode.estimated_risk; int new_risk = (curNode.estimated_risk + adj_real_risk + 1) / 2; max_risk = max(max_risk, new_risk); } if (max_risk > curNode.real_risk) { curNode.real_risk = max_risk; for (const string& neighbor : curNode.neighbors) { q.push(neighbor); } } processed[current] = true; } } int main() { int C; cin >> C; for (int t = 1; t <= C; ++t) { int N; cin >> N; unordered_map network; vector key_services; for (int i = 0; i < N; ++i) { string id; int risk; cin >> id >> risk; Node node{id, risk, risk, {}}; string neighbor; while (cin.peek() != '\n' && cin >> neighbor) { node.neighbors.push_back(neighbor); } cin.ignore(); if (id[0] == 'k') key_services.push_back(id); network[id] = node; } calculateRealRisk(network); cout << "Case #" << t << ": " << key_services.size(); for (const string& ks : key_services) { cout << " " << ks << " " << network[ks].real_risk; } cout << "\n"; } return 0; }