Cod sursa(job #742533)

Utilizator adysnookAdrian Munteanu adysnook Data 30 aprilie 2012 16:11:39
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<fstream>
#include<algorithm>
#include<vector>

using namespace std;
#define NEGINF -32000

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

struct sEdges{int x,y,c;};
int n,m,sum=0,msel=0;
vector<sEdges> costs;

class CompareEdges
{
public:
    bool operator()(const sEdges& x, const sEdges& y) const
    {
        return x.c < y.c;
    }
};

void citire()
{
    fin>>n>>m; 
    int x,y,c;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        sEdges k;
        k.x=x;
        k.y=y;
        k.c=c;
        costs.push_back(k);
    }
    fin.close();
}

void rezolva()
{
    int *vertex;
    vertex=new int[n+1];
    for(int i=1;i<=n;i++) vertex[i]=i;
    make_heap(costs.begin(),costs.end(),CompareEdges());
    sort_heap(costs.begin(),costs.end(),CompareEdges());
    for(int i=0;i<m;i++)
    {
        sEdges k=costs[i];
        if(vertex[k.x]!=vertex[k.y]) {
			sum+=k.c;
			msel++;
            int vX=vertex[k.x];
            int vY=vertex[k.y];
            for(int j=1;j<=n;j++)
                if(vertex[j]==vX || vertex[j]==vY)
                    vertex[j]=vY;
        } else
            costs[i].c=NEGINF;
    }
}

void afiseaza()
{
	fout<<sum<<" "<<msel<<endl;
    for(int i=0;i<m;i++)
        if(costs[i].c!=NEGINF)
            fout<<costs[i].x<<" "<<costs[i].y<<"\n";
    fout.close();
}

int main()
{
    citire();
    rezolva();
    afiseaza();    
    return 0;
}