Cod sursa(job #1529097)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 20 noiembrie 2015 15:29:28
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <fstream>
#include <vector>
#include <algorithm>

#define NMax 10100

using namespace std;

ifstream f("online.in");
ofstream g("online.out");

int nodes, nEdges, queries, disTree[NMax];
struct edge {
    short int node1;
    short int node2;
    short int cost;
} edges[2*NMax];

bool cmp(const edge e1, const edge e2)
{
    return e1.cost < e2.cost;
}

int findFather(int node)
{
    while (disTree[node] > 0)
        node = disTree[node];
    
    return node;
}

int kruskal() {
    int cost = 0;
    
    sort(edges+1, edges+nEdges+1, cmp);
    for (int i=1; i<=nodes; i++)
        disTree[i] = -1;
    
    nEdges = 0;
    for (int i=1; nEdges < nodes - 1; i++) {
        edge crtEdge = edges[i];
        
        int fath1 = findFather(crtEdge.node1);
        int fath2 = findFather(crtEdge.node2);
        
        if (fath1 != fath2) {
            if (-disTree[fath1] > -disTree[fath2]) {
                disTree[fath1] += disTree[fath2];
                disTree[fath2] = fath1;
                
                int node = crtEdge.node2;
                while (disTree[node] > 0) {
                    disTree[node] = fath1;
                    node = disTree[node];
                }
                
            }
            else {
                disTree[fath2] += disTree[fath1];
                disTree[fath1] = fath2;
                
                int node = crtEdge.node1;
                while (disTree[node] > 0) {
                    disTree[node] = fath2;
                    node = disTree[node];
                }
            }
            
            ++nEdges;
            edges[nEdges].node1 = crtEdge.node1;
            edges[nEdges].node2 = crtEdge.node2;
            edges[nEdges].cost = crtEdge.cost;
            
            cost += crtEdge.cost;
        }
    }
    
    return cost;
}

int main()
{
    f>>nodes>>nEdges;

    for (int i=1; i<=nEdges; i++)
        f>>edges[i].node1>>edges[i].node2>>edges[i].cost;
    
    g<<kruskal()<<"\n";
    
    f>>queries;
    edge newEdge;
    for (int i=1; i<=queries; i++) {
        f>>newEdge.node1>>newEdge.node2>>newEdge.cost;
        edges[++nEdges] = newEdge;
        
        
        g<<kruskal()<<"\n";
    }
    
    return 0;
}