Cod sursă (job #521961)

Utilizator avatar TediDinuta Dinuta Eduard Stefan TediDinuta IP ascuns
Problemă Zapada (clasele 11 și 12) Compilator cpp | 1,28 kb
Rundă easy_oli1 Status evaluat
Dată 25 ian. 2020 15:08:48 Scor 0
#include <bits/stdc++.h>

using namespace std;
ifstream in("zapada.in");
ofstream out("zapada.out");
int n,m,k,p[10001],a,b,z;
struct zapada
{
    short x,y;
    int c;
    bool operator<(const zapada &aux) const
    {
        return c<aux.c;
    }
};
multiset<zapada> s;
vector<zapada> temp;
int find(int x)
{
    int r=x;
    while(p[r]!=r) r=p[r];
    while(p[x]!=r)
    {
        int aux=p[x];
        p[x]=r;
        x=p[x];
    }
    return r;
}
void Union(int x,int y)
{
    int rx=find(x);
    int ry=find(y);
    if(rx!=ry) p[rx]=ry;
}
int kruskal(bool first)
{
    int cr=0,cmin=0;
    for(int i=1;i<=n;i++) p[i]=i;
    for(auto it:s)
    {
        if(find(it.x)!=find(it.y))
        {
            Union(it.x,it.y);
            cmin+=it.c;
            cr++;
            if(first==1) temp.push_back({it.x,it.y,it.c});
        }
        if(cr==n-1) break;
    }
    return cmin;
}
int main()
{
    in>>n>>m>>k;
    for(int i=1;i<=m;i++)
    {
        in>>a>>b>>z;
        s.insert({a,b,z});
    }
    out<<kruskal(1)<<'\n';
    s.clear();
    for(auto it:temp)
        s.insert(it);
    temp.clear();
    for(int i=1;i<=k;i++)
    {
        in>>a>>b>>z;
        s.insert({a,b,z});
        out<<kruskal(0)<<'\n';
    }
    return 0;
}