Cod sursa(job #631517)

Utilizator paulyBereschi Paul pauly Data 8 noiembrie 2011 13:04:02
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<fstream>
#include<algorithm>
#include<vector>

using namespace std;
#define NEGINF -32000

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

struct sEdges{int x,y,c;};
int n,m;
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]) {
            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()
{
    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;
}