Cod sursa(job #1348399)

Utilizator sulzandreiandrei sulzandrei Data 19 februarie 2015 18:00:04
Problema Arbore partial de cost minim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <map>
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
int tata[200000];
struct ele
{
    int x,y,c,e;
};
bool cmp(struct ele a,struct ele b)
{
    if (a.c<b.c)
        return true;
    return false;
}
int gr(int x);
void miau(int x,int y)
{
    tata[gr(x)] = tata[gr(y)];
}
int main()
{
    int n,m,i,j;
    in>>n>>m;
    struct ele v[m+1];
    bool frec[n+1];
    for(i=1;i<=n;i++)
        frec[i] = 0;
    int exis[n+1];
    for(i=1;i<=n;i++)
        tata[i]=i;
    for(i=1;i<=n;i++)
        exis[i]=i;
    struct ele ao;
    for(i=1;i<=m+1;i++)
        v[i].e =3;
    for(i=1;i<=m;i++)
    {
        in>>ao.x;
        in>>ao.y;
        in>>ao.c;
        v[i] = ao;
        v[i].e = 0;
    }
    sort(v+1,v+m+1,cmp);
    int costul=0,nr=0;
    int ambgnm = 0;
    for(i = 1;i<=m && ambgnm!=n;i++)
    {
        if (gr(v[i].x)!= gr(v[i].y))
        {
            if (frec[v[i].x]==0)
            {
                ambgnm++;
                frec[v[i].x] = 1;
            }
            if (frec[v[i].y]==0)
            {
                ambgnm++;
                frec[v[i].y] = 1;
            }
            nr++;
            miau(v[i].x,v[i].y);
            costul +=v[i].c;
        }
        else
          v[i].e = 1;
    }
    out<<costul<<"\n";
    out<<nr<<"\n";
    for(i=1;i<=m;i++)
        if(v[i].e==0)
            out<<v[i].x<<" "<<v[i].y<<" "<<"\n";
    return 0;
}
int gr(int x)
{
    if (tata[x]==x)
        return x;
    else
        gr(tata[x]);
}