Cod sursa(job #2069832)

Utilizator titusTitus A titus Data 18 noiembrie 2017 21:01:19
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
# include <cstdio>
# include <algorithm>
using namespace std;

struct muchie {
    int x, y, c;
}u[200005], sol[200005];

int n, m, k, i, ct, j, nr1, nr2;
int P[200005], T[200005];

bool cmp(muchie x, muchie y )
{
    return x.c < y.c;
}

int Root(int x)
{
    while(T[x] != x)
        x = T[x];
    return x;
}

void Unifica(int x, int y)
{
    if(P[x] < P[y])
        T[x] = y;
    if(P[x] > P[y])
        T[y] = x;
    if(P[x] == P[y]){
        T[y] = x;
        P[x]++;
    }
}

int main()
{
   freopen("apm.in", "r", stdin);
   freopen("apm.out","w", stdout);

   scanf("%d %d", &n, &m);
   for (i=1; i<=m; ++i) {
        scanf("%d %d %d", &u[i].x, &u[i].y, &u[i].c);
        T[i] = i; /// padurea de arbori indepedenti
    }

   ///sortam crescator dupa cost
   sort(u+1, u+m+1, cmp);

   i = 1;
   while (k < n-1) {
       ///muchia (x,y)
        int rx = Root(u[i].x);
        int ry = Root(u[i].y);
        if (rx != ry){
             ++k;
             ct += u[i].c;
             sol[k] = u[i];
             Unifica(rx, ry);
        }
        ++i;
    }

  printf("%d\n%d\n", ct, k);
  for (i=1; i<=k; ++i)
      printf("%d %d\n", sol[i].x, sol[i].y);

  return 0;
}