Cod sursă (job #341758)

Utilizator avatar andreeagoidea Andreea Goidea andreeagoidea IP ascuns
Problemă Zapada (clasele 11 și 12) Compilator cpp | 1,29 kb
Rundă Arhiva de probleme Status evaluat
Dată 21 ian. 2018 12:08:51 Scor 10
#include <cstdio>
#include <algorithm>

using namespace std;

struct drum
{
    int nod1, nod2, cost;
};

drum v[101002];

int tati[10001];

int i, n, m, costmin, k, j, nrsol;

bool cmp(const drum a, const drum b)
{
    if(a.cost<b.cost)
        return true;
    return false;
}

int tata(int nod)
{
    if(tati[nod]==nod)
        return nod;
    else
        return tati[nod]=tata(tati[nod]);
}

void join(int nod, int node)
{
    int rx, ry;
    rx=tata(nod);
    ry=tata(node);
    tati[rx]=ry;
}

int main()
{
    freopen("zapada.in", "r", stdin);
    freopen("zapada.out", "w", stdout);
    scanf("%d%d%d", &n, &m, &k);
    for(j=1; j<m; j++)
        scanf("%d%d%d", &v[j].nod1, &v[j].nod2, &v[j].cost);
    for(j; j<=k+m; j++)
    {
        for(i=1; i<=n; i++)
            tati[i]=i;
        scanf("%d%d%d", &v[j].nod1, &v[j].nod2, &v[j].cost);
        costmin=0;
        sort(v+1, v+j+1, cmp);
        i=1;
        nrsol=1;
        while(nrsol<n && i<=m)
        {
            if(tati[tata(v[i].nod1)]!=tati[tata(v[i].nod2)])
            {
                costmin=costmin+v[i].cost;
                join(v[i].nod1, v[i].nod2);
                nrsol++;
            }
            i++;
        }
        printf("%d\n", costmin);
    }
    return 0;
}