Pagini recente »
Borderou de evaluare (job #115890)
|
Cod sursă (job #525421)
|
Cod sursă (job #785872)
|
Borderou de evaluare (job #246502)
|
Cod sursă (job #720074)
Cod sursă (job
#720074)
#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;
}