Cod sursa(job #1970157)

Utilizator mihai.alphamihai craciun mihai.alpha Data 18 aprilie 2017 22:53:38
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

FILE *fin = fopen("apm.in", "r");
FILE *fout = fopen("apm.out", "w");

const int maxm = 400000;
const int maxn = 200000;

struct much  {
    int x, y, c;
    const bool operator < (const much &a) const  {
        return c < a.c;
    };
};

int n, m;
much v[maxm + 1];
int tata[maxm + 1];

inline int find1(int x)  {
    int x1 = x;
    while(x1 != tata[x1])
        x1 = tata[x1];
    while(x != tata[x])  {
        int cx = tata[x];
        tata[x] = x1;
        x = cx;
    }
    return x1;
}

inline void union1(int x, int y)  {
    tata[find1(x)] = find1(y);
}

vector <int> sol;

int main()  {
    fscanf(fin, "%d%d", &n, &m);
    for(int i = 1;i <= m;i++)
        tata[i] = i;
    for(int i = 1;i <= m;i++)  {
        fscanf(fin, "%d%d%d", &v[i].x, &v[i].y, &v[i].c);
    }
    sort(v + 1, v + m + 1);
    int costarb = 0;
    for(int i = 1;i <= m;i++)  {
        int x1 = find1(v[i].x), y1 = find1(v[i].y);
        if(x1 != y1)  {
            union1(x1, y1);
            costarb += v[i].c;
            sol.push_back(i);
        }
    }
    fprintf(fout, "%d\n%d\n", costarb, sol.size());
    for(auto &x : sol)  {
        fprintf(fout, "%d %d\n", v[x].x, v[x].y);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}