Cod sursa(job #689987)

Utilizator flaviusc11Fl. C. flaviusc11 Data 25 februarie 2012 00:44:33
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct noduri{int from,to,cost;};
vector<noduri>v,sol;

vector<int>c;
int n,m,s,Nrcomp,Msel;
bool cmp(noduri i, noduri j)
{
    return (i.cost>j.cost);
}

void citire()
{
    freopen("apm.in","r",stdin);
    scanf("%d%d",&n,&m);
    int i,x,y,z;
    Nrcomp=n;
    c.push_back(1);
    for(i=1;i<=n;++i)
      c.push_back(i);
     // printf("%d\n",c[0]);
    noduri aux;
    for(i=1;i<=m;++i)
     {
         scanf("%d%d%d",&aux.from,&aux.to,&aux.cost);
         v.push_back(aux);
     }
}
void afisare()
{
	freopen("apm.out","w",stdout);
	int i;
	printf("%d\n%d\n",s,sol.size());
	for(i=0;i<sol.size();++i)
	   printf("%d %d\n",sol[i].from,sol[i].to);
}
int main()
{
	citire();
	make_heap(v.begin(),v.end(),cmp);
	while(Msel<n-1)
	{
        noduri aux;
        int minim,maxim,i;
        aux=v.front();

        pop_heap(v.begin(),v.end(),cmp); v.pop_back();
        if(c[aux.from]!=c[aux.to])
        {
            s=s+aux.cost;
            sol.push_back(aux);
            if(c[aux.from]>c[aux.to])
               {
                   minim=c[aux.to];
                   maxim=c[aux.from];
               }
            else
               {
                   minim=c[aux.from];
                   maxim=c[aux.to];
               }
            for(i=1;i<=n;++i) if(c[i]==maxim) c[i]=minim;
            --Nrcomp;
            ++Msel;
        }
	}
	afisare();
    return 0;
}