Cod sursă (job #365484)

Utilizator avatar andreistan00 Andrei Stan andreistan00 IP ascuns
Problemă Zapada (clasele 11 și 12) Compilator cpp | 1,53 kb
Rundă Arhiva de probleme Status evaluat
Dată 14 mar. 2018 19:07:38 Scor 10
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("zapada.in");
ofstream g ("zapada.out");

struct nod
{
    int x, c;
    nod *leg;
};

struct muchie
{
    int i, j, c;
};

nod *v[10001];
muchie m[100001];
bool S[100001];
int CC[10001];
int N, M, K;

void add (nod *&dest, int x, int c)
{
    nod *p;
    p = new nod;
    p->x = x;
    p->c = c;
    p->leg = dest;
    dest = p;
}

void citire()
{
    f >> N >> M >> K;
    for (int i = 1; i <= M; i++)
    {
        f >> m[i].i >> m[i].j >> m[i].c;
        //add (v[x], y, c);
        //add (v[y], x, c);
    }
}

bool comp (const muchie &a, const muchie &b)
{
    return a.c < b.c;
}

int Kruskal (int nrm)
{
    int cost = 0;
    int poz = 0;
    sort (m + 1, m + nrm + 1, comp);
    for (int i = 1; i <= N; i++)
    {
        CC[i] = i;
        S[i] = 0;
    }
    for (int l = 1; l < N; l++)
    {
        int k = poz;
        do
        {
            k++;
        }
        while (CC[m[k].i] == CC[m[k].j]);
        S[k] = 1;
        cost += m[k].c;
        poz = k;
        int ccj = m[k].j;
        for (int i = 1; i <= N; i++)
            if (CC[i] == ccj)
                CC[i] = CC[m[k].i];
    }
    return cost;
}

int main()
{
    citire();
    g << Kruskal (M) << '\n';
    int nrm = M;
    int MK = M + K;
    for (int i = M + 1; i <= MK; i++)
    {
        f >> m[i].i >> m[i].j >> m[i].c;
        nrm++;
        g << Kruskal (nrm) << '\n';
    }
    return 0;
}