Cod sursa(job #1623388)

Utilizator calin9819Costea Calin calin9819 Data 1 martie 2016 19:12:54
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
using namespace std;

#define MAX_N 200001
#define MAX_M 400001
#define INF 0x3f3f

ifstream fin("apm.in");
ofstream fout("apm.out");

int nrm;

struct muchie
{
    int x, y, c;
} e[MAX_N], sol[MAX_N];
int N, M, T[MAX_N], cost;

void citire()
{
    fin >> N >> M;
    for (int i = 1; i <= M; i++)
    {
        fin >> e[i].x >> e[i].y >> e[i].c;

    }
}


void reuneste(int i, int j)
{
    int k;
    i = T[i];
    j = T[j];
    if (i == j) return;
    for (k = 1; k <= N; k++)
        if (T[k] == i) T[k] = j;
}

int comp_muchie(const void *i, const void *j)
{
    return ((int *) i)[2] - ((int *)j)[2];
}

void kruskal(void)
{
    int i, j, k, c;
    qsort(e, M, sizeof(e[0]), comp_muchie);
    for (i = 1; i <= N; i++) T[i] = i;
    for (k = 0; k < M; k++)
    {
        i = e[k].x;
        j = e[k].y;
        c = e[k].c;
        if(T[i] == T[j]) continue;
        reuneste(i, j);
        cost += c;
        nrm++;
        sol[nrm].x = i;
        sol[nrm].y = j;
        sol[nrm].c = c;
    }
    fout << nrm << "\n" << cost << "\n";
    for (i = 1; i <= nrm; i++) {
        fout << sol[i].x << " " << sol[i].y << "\n";
    }
}

int main()
{
    citire();
    kruskal();
    return 0;
}