Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- struct Node {
- string id;
- int estimated_risk;
- int real_risk;
- vector<string> neighbors;
- };
- void calculateRealRisk(unordered_map<string, Node>& network) {
- queue<string> q;
- unordered_map<string, bool> 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<string, Node> network;
- vector<string> 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement