Cod sursa(job #1831044)

Utilizator ericutzdevilEric Spataru ericutzdevil Data 17 decembrie 2016 13:26:19
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<ctime>

using namespace std;

struct nodd{
    int x;
    int y;
    int cost;
    bool marcare;};

nodd v[400001];
int dad[200001];

bool sortare (nodd a, nodd b){
    if (a.cost<b.cost){
        return true;}
    return false;}

int findd (int nod){
    if (nod==dad[nod])
        return nod;
    else
        dad[nod]=findd(dad[nod]);
    return dad[nod];}

void unionn (int nod1, int nod2){
    int a,b;
    a=findd(nod1);
    b=findd(nod2);
    if (a!=b){
        if (rand()%2==0)
            dad[a]=b;
        else
            dad[b]=a;
    }
}

int main()

{

int n,m,i,s,nrmuchii;

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

srand(time(0));

scanf ("%d%d",&n,&m);

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

for (i=1;i<=n;i++)
    dad[i]=i;

sort (v+1,v+m+1,sortare);

nrmuchii=0;
s=0;

for (i=1;i<=m&&nrmuchii<n-1;i++){
    if (findd(v[i].x)!=findd(v[i].y)){
        unionn(v[i].x,v[i].y);
        s=s+v[i].cost;
        nrmuchii++;
        v[i].marcare=1;
    }
}

printf("%d\n%d\n",s,nrmuchii);
for (i=1;i<=m;i++)
    if (v[i].marcare==1)
        printf ("%d %d\n",v[i].x,v[i].y);

return 0;
}