Cod sursa(job #3185978)

Utilizator vvvvvvvvvvvvvVusc David vvvvvvvvvvvvv Data 20 decembrie 2023 22:47:47
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

struct edge
{
    int x, y, c;
};

ifstream fin("zapada.in");
ofstream fout("zapada.out");
int n, m, k, rang[10005], d[10005], costT, x, y, c;;
vector<edge> edges, used;

inline int FindSet(int k){
    int x = k;
    while (d[k] != k) k = d[k];
    while (d[x] != x) d[x] = k, x = d[x];
    return k;
}

inline void DoUnion(int x, int y){
    if(rang[x] > rang[y]) d[y] = x;
    else if(rang[x] < rang[y]) d[x] = y;
    else d[y] = x, rang[x]++;
}

bool cmp(edge a, edge b){
    return a.c < b.c;
}

inline void Kruskal(int m){
    int nrM = 0, cost = 0;
    for(int i = 0; i < m; i++){
        int x = FindSet(edges[i].x), y = FindSet(edges[i].y), c = edges[i].c;
        if(x != y){
            DoUnion(x, y);
            cost += c;
            nrM++;
            used.push_back({x, y, c});
        }
    }
    costT = cost;
}

inline void Init(){
    for(int i = 1; i <= n; i++) d[i] = i, rang[i] = 1;
}

int main(){
    fin >> n >> m >> k;
    for(int i = 1; i <= m; i++){
        fin >> x >> y >> c;
        edges.push_back({x, y, c});
    }
    Init();
    sort(edges.begin(), edges.end(), cmp);
    Kruskal(edges.size());
    fout << costT << '\n';
    for(int i = 1; i <= k; i++){
        fin >> x >> y >> c;
        if(used.back().c > c){
            Init();
            used.push_back({x, y, c});
            for(int i = used.size() - 1; i > 0; i--){
                if(used[i].c < used[i - 1].c) swap(used[i], used[i - 1]); 
                else break;
            }
            edges = used;
            used.clear();
            Kruskal(n);
        }
        fout << costT << '\n';
    }
    return 0;
}