Cod sursă (job #720074)

Utilizator avatar clipcadaniela Clipca Daniela clipcadaniela IP ascuns
Problemă Zapada (clasele 11 și 12) Compilator cpp-32 | 2,87 kb
Rundă Arhiva de probleme Status evaluat
Dată 18 mai 2023 08:17:09 Scor 0
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

struct Edge {
    int from, to, cost;
};

struct UnionFind {
    vector<int> parent, rank;
    
    UnionFind(int n) {
        parent.resize(n);
        rank.resize(n, 0);
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }
    }
    
    int find(int x) {
        if (parent[x] != x) {
            parent[x] = find(parent[x]);
        }
        return parent[x];
    }
    
    bool unite(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        
        if (rootX == rootY) {
            return false;
        }
        
        if (rank[rootX] < rank[rootY]) {
            parent[rootX] = rootY;
        } else if (rank[rootX] > rank[rootY]) {
            parent[rootY] = rootX;
        } else {
            parent[rootY] = rootX;
            rank[rootX]++;
        }
        
        return true;
    }
};

vector<int> calculate_minimum_cost(int N, int M, int K, vector<Edge>& roads, vector<Edge>& new_roads) {
    vector<vector<pair<int, int> > > graph(N + 1);
    vector<int> min_costs;
    for (const auto& road : roads) {
        graph[road.from].emplace_back(road.to, road.cost);
        graph[road.to].emplace_back(road.from, road.cost);
        min_costs.push_back(road.cost);
    }
    
    sort(min_costs.begin(), min_costs.end());
    UnionFind union_find(N + 1);
    int total_cost = accumulate(min_costs.begin(), min_costs.begin() + N - 1, 0);
    vector<int> result;
    result.push_back(total_cost);
    
    for (const auto& new_road : new_roads) {
        graph[new_road.from].emplace_back(new_road.to, new_road.cost);
        graph[new_road.to].emplace_back(new_road.from, new_road.cost);
        min_costs.push_back(new_road.cost);
        total_cost += new_road.cost;
        
        while (!union_find.unite(new_road.from, new_road.to)) {
            int min_cost = min_costs.front();
            min_costs.erase(min_costs.begin());
            total_cost -= min_cost;
        }
        
        result.push_back(total_cost);
    }
    
    return result;
}

int main() {
    ifstream inputFile("zapada.in");
    ofstream outputFile("zapada.out");
    
    int N, M, K;
    inputFile >> N >> M >> K;
    
    vector<Edge> roads(M);
    for (int i = 0; i < M; i++) {
        inputFile >> roads[i].from >> roads[i].to >> roads[i].cost;
    }
    
    vector<Edge> new_roads(K);
    for (int i = 0; i < K; i++) {
        inputFile >> new_roads[i].from >> new_roads[i].to >> new_roads[i].cost;
    }
    
    vector<int> result = calculate_minimum_cost(N, M, K, roads, new_roads);
    
    for (const auto& cost : result) {
        outputFile << cost << endl;
    }
    
    inputFile.close();
    outputFile.close();
    
    return 0;
}