Cod sursa(job #2072991)

Utilizator monicalMonica L monical Data 22 noiembrie 2017 16:18:41
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
//APM - Kruskal
#include <stdio.h>
#include <algorithm>

using namespace std;

struct muchie
  {
      int x,y,c;

  } u[400001], a[400001];

int m,n;

FILE *f=fopen("apm.in","r");
FILE *g=fopen("apm.out","w");

int comp(muchie a, muchie b)
{
    return a.c<b.c;
}


void citire()
{int i;
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=m;i++)
	fscanf(f,"%d %d %d",&u[i].x,&u[i].y,&u[i].c);
}

int main()
{int i,j,l[200001],ct,k,v,w;

 citire();

 sort(u+1,u+m+1,comp); // sortez vectorul de muchii crescator dupa cost

 for (i=1;i<=n;i++) l[i]=i; // vf i face parte din subarborele i
 ct=0;
 k=0;

 i=1;
 while (k<n-1) //se aleg n-1 muchii
   { w=l[u[i].x];
     v=l[u[i].y];
     if (v!=w)// daca extremitatile muchiei nu fac parte din acelasi subarbore
      {
       ct+=u[i].c;
       a[++k]=u[i]; // retin muchia adaugata la APM

       for (j=1;j<=n;j++) // unific cei doi subarbori
	      if (l[j]==v) l[j]=w;
      }
    i++; // trece la urmatoarea muchie
   }

 fprintf(g,"%d\n%d\n",ct,k);
 for (i=1;i<=k;i++) fprintf(g,"%d %d\n",a[i].x,a[i].y);
 return 0;
}