Cod sursa(job #663815)

Utilizator I.AlexandruIlie Alexandru I.Alexandru Data 18 ianuarie 2012 23:10:45
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<iostream>
#include<stdio.h>
#include<cstdlib>
#define maxm 400004
#define maxn 200002
using namespace std;

struct muchie{
int cap1, cap2, cost, apm;
};
        
muchie v[maxm];
int n, m, compconex[maxn], costarbore=0;

int find(int i)
{if(compconex[i]!=i)
   compconex[i]=find(compconex[i]);
return compconex[i];
}
       
void swap(muchie &a, muchie &b)
{muchie aux=a;
a=b;
b=aux;
}

void quicksort(muchie v[], int start, int end) 
{int i=start;
int j=end;
int pivot=v[i+rand()%(j-i)].cost;

while(i<=j)
     {while(v[i].cost<pivot)
           i++;
      while(v[j].cost>pivot)
           j--;
      if(i<=j)
        {swap(v[i], v[j]);
         i++;
         j--;
        }
     }
     
if(start<j)
  quicksort(v, start, j);
if(i<end)
  quicksort(v, i, end);
}       
       
int main()
{freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
scanf("%d", &n);
scanf("%d", &m);

for(int i=1; i<=m; i++)
   {scanf("%d", &v[i].cap1);
    scanf("%d", &v[i].cap2);
    scanf("%d", &v[i].cost);
   }

for(int i=1; i<=n; i++)
   compconex[i]=i;
   
srand(time(NULL));
quicksort(v, 1, m);
            
for(int i=1, k=1; i<=m && k<n; i++)
   {if(compconex[find(v[i].cap1)]!=compconex[find(v[i].cap2)])
      {compconex[find(v[i].cap1)]=find(v[i].cap2);
       v[i].apm=1;
       costarbore+=v[i].cost;
       k++;
      }
   }

printf("%d\n%d\n", costarbore, n-1);   
for(int i=1; i<=m; i++)
   if(v[i].apm==1)
     printf("%d %d\n", v[i].cap2, v[i].cap1);
return 0;
}