Cod sursa(job #1341916)

Utilizator robert.iacobIacob Robert robert.iacob Data 13 februarie 2015 11:31:33
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

struct muchie
{
    int x,y,c;
};

struct muchie1
{
    int x,y;
};
muchie1 b[200005];
muchie a[400005];
int t[200005], ctc[200005];
int n,m,cost,k1;

bool Cmp(muchie a, muchie b)
{
    return a.c < b.c;
}

void Citire()
{
    int i,x1,y1,c1;
    ifstream fin("apm.in");
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x1>>y1>>c1;
        a[i].x=x1;
        a[i].y=y1;
        a[i].c=c1;
    }
    fin.close();
}

void Union (int g, int h)
{
    if(ctc[g]>ctc[h])
    {
        t[g]=h;
        ctc[g]+=ctc[h];
    }
    else
    {
        t[h]=g;
        ctc[h]+=ctc[g];
    }
}

int Find(int p)
{
    if(t[p]!=p)
        t[p]=Find(t[p]);
    return t[p];
}

/*void Unifica(int va1, int va2)
{
    for(int i=1;i<=n;i++)
        if(t[i]==va2)
            t[i]=va1;
}*/



void Kruskal()
{
    sort(a+1,a+m+1,Cmp);
    int i,v1,v2,k;
    k=n-1;
    for(i=1;i<=n;i++)
    {
        t[i]=i;
        ctc[i]=1;
    }
    for(i=1; k>0 && i<=m;i++)
    {
        v1=Find(a[i].x);
        v2=Find(a[i].y);
        if(t[v1]!=t[v2])
        {
            Union(t[v1],t[v2]);
            k1++;
            b[k1].x=a[i].y;
            b[k1].y=a[i].x;
            cost+=a[i].c;
            k--;
        }
    }
}

int main()
{
    Citire();
    Kruskal();
    ofstream fout("apm.out");
    fout<<cost<<"\n";
    fout<<n-1<<"\n";
    for(int i=1;i<=k1;i++)
        fout<<b[i].x<<" "<<b[i].y<<"\n";
    fout.close();
    return 0;
}