Cod sursa(job #903112)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 1 martie 2013 18:34:22
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <algorithm>
#define nmax 200100
#define mmax 400100
using namespace std;

struct edge{int x,y,cost,k;}Edge[mmax];
int N,M,Answer,Apm[nmax],T[nmax];

int Dfs(int Nod) {

    if(T[Nod]!=Nod)
        return (T[Nod]=Dfs(T[Nod]));
    return Nod;

}
bool compare(edge A,edge B) {

    return A.cost<B.cost;

}
void solve() {

    int i,A,B,Nr;

    sort(Edge+1,Edge+M+1,compare);

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

    for(i=1,Nr=0;i<=M;i++) {

        A=Dfs(Edge[i].x);
        B=Dfs(Edge[i].y);

        if(A!=B) {
            Answer+=Edge[i].cost;
            Apm[++Nr]=i;
            T[A]=B;
            }

        }

}
void read() {

    int i;
    ifstream in("apm.in");
    in>>N>>M;

    for(i=1;i<=M;i++) {
        in>>Edge[i].x>>Edge[i].y>>Edge[i].cost;
        Edge[i].k=i;
        }

    in.close();

}
void write() {

    ofstream out("apm.out");
    out<<Answer<<'\n'<<(N-1)<<'\n';

    for(int i=1;i<N;i++)
        out<<Edge[Apm[i]].x<<' '<<Edge[Apm[i]].y<<'\n';

    out.close();

}
int main() {

    read();
    solve();
    write();

    return 0;

}