Cod sursa(job #1609791)

Utilizator gerd13David Gergely gerd13 Data 23 februarie 2016 00:12:16
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define pb push_back
#define mp make_pair

using namespace std;

const int NMAX = 200200 ;
const int INF = 0x3f3f3f3f ;


struct Edge
{
    int x, y, cost ;
} unu;

int N, M, S, SOL[NMAX], cost, noduri[NMAX] ;


vector <Edge> A ;

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


bool compare(Edge a, Edge b)
{
    if(a.cost < b.cost)
        return true;
    return false ;
}

int search_edge(int edge)
{

    if(edge != noduri[edge])
        noduri[edge] = search_edge(noduri[edge]) ;

    return noduri[edge] ;

}

inline void R(int cord_x, int cord_y)
{
    noduri[search_edge(cord_x)] = search_edge(cord_y) ;
}

inline void Kruskal()
{
    sort(A.begin(), A.end(), compare) ;

    for(int i = 1 ; i <= N ; ++ i)
        noduri[i] = i ;

    for(int i = 0 ; i < M && SOL[0] != N - 1 ; ++ i)
        if(search_edge(A[i].x) != search_edge(A[i].y))
        {
            cost += A[i].cost ;
            SOL[++SOL[0]] = i ;
            R(A[i].x, A[i].y) ;

        }
}


int main()
{
    fin >> N >> M ;

    for(int i = 1 ; i <= M ; ++ i)
    {
        fin >> unu.x >> unu.y >> unu.cost ;
        A.push_back(unu) ;
    }

    Kruskal() ;

    fout << cost << '\n' ;
    fout << N - 1 << '\n' ;

    for(int i = 1 ; i <= SOL[0] ; ++ i)
        fout << A[SOL[i]].x << ' ' << A[SOL[i]].y << '\n' ;

    fin.close() ;
    fout.close() ;
    return 0;
}