Cod sursa(job #2703073)

Utilizator Costea_AlexandruCostea Alexandru Costea_Alexandru Data 7 februarie 2021 00:01:31
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
using namespace std;
ifstream fi("apm.in");
ofstream fo("apm.out");
int n,m,i,j,rez,t[200001],r;
struct muchie{int x,y,c;}v[400001];
int Radacina(int x)
{
    if(x == t[x])
        return x;
    return t[x] = Radacina(t[x]);
}
void Unire(int x, int y)
{
    t[x] = y;
}
void Qsort(int ls, int ld)
{
    int p=v[ls].c,i=ls,j=ld;
    do{
       while(v[i].c < p)
        i++;
       while(v[j].c > p)
        j--;
       if(i<=j)
       {
        swap(v[i],v[j]);
        i++;
        j--;
       }
    }while(i <= j);
    if(ls < j)
        Qsort(ls,j);
    if(ld > i)
        Qsort(i,ld);
}
int main()
{
    fi >> n >> m;
    for(i=1; i<=m; i++)
        fi >> v[i].x >> v[i].y >> v[i].c;
    Qsort(1,m);
    for(i=1; i<=n; i++)
        t[i] = i;
    for(i=1; i<=m; i++)
    {
        if(Radacina(v[i].x) != Radacina(v[i].y))
        {
            rez += v[i].c;
            v[i].c = -10001;
            r++;
            Unire(Radacina(v[i].x),Radacina(v[i].y));
        }
    }
    fo << rez << '\n' << r << '\n';
    for(i=1; i<=m; i++)
        if(v[i].c == -10001)
          fo << v[i].x << " " << v[i].y << '\n';
    return 0;
}